dash/test/lint
MarcoFalke 33384816b5 Merge #14519: tests: add utility to easily profile node performance with perf
13782b8ba8 docs: add perf section to developer docs (James O'Beirne)
58180b5fd4 tests: add utility to easily profile node performance with perf (James O'Beirne)

Pull request description:

  Adds a context manager to easily (and selectively) profile node performance during functional test execution using `perf`.

  While writing some tests, I encountered some odd bitcoind slowness. I wrote up a utility (`TestNode.profile_with_perf`) that generates performance diagnostics for a node by running `perf` during the execution of a particular region of test code.

  `perf` usage is detailed in the excellent (and sadly unmerged) https://github.com/bitcoin/bitcoin/pull/12649; all due props to @eklitzke.

  ### Example

  ```python
  with node.profile_with_perf("large-msgs"):
      for i in range(200):
          node.p2p.send_message(some_large_msg)
      node.p2p.sync_with_ping()
  ```

  This generates a perf data file in the test node's datadir (`/tmp/testtxmpod0y/node0/node-0-TestName-large-msgs.perf.data`).

  Running `perf report` generates nice output about where the node spent most of its time while running that part of the test:

  ```bash
  $ perf report -i /tmp/testtxmpod0y/node0/node-0-TestName-large-msgs.perf.data --stdio \
    | c++filt \
    | less

  # To display the perf.data header info, please use --header/--header-only options.
  #
  #
  # Total Lost Samples: 0
  #
  # Samples: 135  of event 'cycles:pp'
  # Event count (approx.): 1458205679493582
  #
  # Children      Self  Command          Shared Object        Symbol
  # ........  ........  ...............  ...................  ........................................................................................................................................................................................................................................................................
  #
      70.14%     0.00%  bitcoin-net      bitcoind             [.] CNode::ReceiveMsgBytes(char const*, unsigned int, bool&)
                  |
                  ---CNode::ReceiveMsgBytes(char const*, unsigned int, bool&)

      70.14%     0.00%  bitcoin-net      bitcoind             [.] CNetMessage::readData(char const*, unsigned int)
                  |
                  ---CNetMessage::readData(char const*, unsigned int)
                     CNode::ReceiveMsgBytes(char const*, unsigned int, bool&)

      35.52%     0.00%  bitcoin-net      bitcoind             [.] std::vector<char, zero_after_free_allocator<char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<char*, std::vector<char, zero_after_free_allocator<char> > >, unsigned long, char const&)
                  |
                  ---std::vector<char, zero_after_free_allocator<char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<char*, std::vector<char, zero_after_free_allocator<char> > >, unsigned long, char const&)
                     CNetMessage::readData(char const*, unsigned int)
                     CNode::ReceiveMsgBytes(char const*, unsigned int, bool&)

  ...
  ```

Tree-SHA512: 9ac4ceaa88818d5eca00994e8e3c8ad42ae019550d6583972a0a4f7b0c4f61032e3d0c476b4ae58756bc5eb8f8015a19a7fc26c095bd588f31d49a37ed0c6b3e
2021-08-18 22:24:36 -03:00
..
check-doc.py Merge bitcoin#14272: init: Remove deprecated args from hidden args (#4335) 2021-08-17 22:53:28 +03:00
check-rpc-mappings.py Merge #13707: tests: Add usage note to check-rpc-mappings.py 2021-06-15 13:15:26 -04:00
commit-script-check.sh Merge #14864: test: Run scripted-diff in subshell 2021-08-15 11:08:08 -04:00
git-subtree-check.sh Merge #17329: linter: Strip trailing / in path for git-subtree-check 2021-07-13 20:43:16 -05:00
lint-all.sh Merge #16036: travis: Run all lint scripts even if one fails 2021-07-10 12:10:51 -05:00
lint-assertions.sh Merge #14088: tests: Don't assert(...) with side effects 2021-07-01 16:33:23 -05:00
lint-circular-dependencies.sh refactor: misc bls, evo, include refactoring (#4305) 2021-07-31 21:29:12 +03:00
lint-filenames.sh Merge #13510: Scripts and tools: Obsolete #!/bin/bash shebang 2020-12-18 12:55:45 -06:00
lint-format-strings.py Merge #14960: lint/format-strings: Correctly exclude escaped percent symbols 2021-07-08 11:57:15 -05:00
lint-format-strings.sh Fix warnings introduced in shellcheck v0.6.0 (Partial Merge: #15166) 2020-07-29 11:02:55 -05:00
lint-git-commit-check.sh Fix lint-git-commit-check.sh (#4267) 2021-07-19 12:32:12 +03:00
lint-include-guards.sh partial merge #17398: Update leveldb to 1.22+ (#4230) 2021-07-15 15:42:55 -05:00
lint-includes.sh Backports v0.18: PR 13743: refactor: Replace boost::bind with std::bind (#4343) 2021-08-17 23:31:09 +03:00
lint-locale-dependence.sh merge #13671: Remove boost/algorithm/string/case_conv.hpp 2021-07-16 20:19:42 +05:30
lint-logs.sh Merge #13510: Scripts and tools: Obsolete #!/bin/bash shebang 2020-12-18 12:55:45 -06:00
lint-python-dead-code.sh Merge #14519: tests: add utility to easily profile node performance with perf 2021-08-18 22:24:36 -03:00
lint-python-utf8-encoding.sh partial merge #17398: Update leveldb to 1.22+ (#4230) 2021-07-15 15:42:55 -05:00
lint-python.sh Merge #13054: tests: Enable automatic detection of undefined names in Python tests scripts. Remove wildcard imports. 2021-07-06 20:29:33 +03:00
lint-shebang.sh Partial Merge #14831: Scripts and tools: Use #!/usr/bin/env bash instead of #!/bin/bash. 2021-08-15 11:08:08 -04:00
lint-shell-locale.sh Partial merge #13863: travis: move script sections to files in .travis/ subject to shellcheck 2021-07-08 13:09:43 -04:00
lint-shell.sh Merge #15170: refactor/lint: Add ignored shellcheck suggestions to an array 2021-06-28 13:40:55 -05:00
lint-spelling.ignore-words.txt Merge #16618: [Fix] Allow connection of a noban banned peer 2021-07-19 19:00:04 -05:00
lint-spelling.sh Merge #16767: test: Check for codespell in lint-spelling.sh 2021-08-11 13:58:48 -04:00
lint-submodule.sh Merge #18056: ci: Check for submodules 2021-07-13 21:17:15 -05:00
lint-tests.sh Merge #13510: Scripts and tools: Obsolete #!/bin/bash shebang 2020-12-18 12:55:45 -06:00
lint-whitespace.sh build: add libgmp detection, make immer a package (#4311) 2021-08-10 22:35:55 +03:00
README.md partial merge #17398: Update leveldb to 1.22+ (#4230) 2021-07-15 15:42:55 -05:00

This folder contains lint scripts.

check-doc.py

Check for missing documentation of command line options.

commit-script-check.sh

Verification of scripted diffs.

git-subtree-check.sh

Run this script from the root of the repository to verify that a subtree matches the contents of the commit it claims to have been updated to.

To use, make sure that you have fetched the upstream repository branch in which the subtree is maintained:

Usage: git-subtree-check.sh DIR (COMMIT)

COMMIT may be omitted, in which case HEAD is used.

lint-all.sh

Calls other scripts with the lint- prefix.