From 48c0afbee841b185db57955ce173d64bd1e11eab Mon Sep 17 00:00:00 2001 From: Brendan Gregg Date: Mon, 14 Jan 2019 17:50:39 -0800 Subject: [PATCH] hist: split negative, zero, and one into separate buckets --- docs/reference_guide.md | 61 +++++++++++++++++++-------------- src/ast/codegen_llvm.cpp | 34 +++++++++++++++++-- src/bpftrace.cpp | 14 ++++++-- tools/biolatency_example.txt | 8 ----- tools/bitesize_example.txt | 65 ++---------------------------------- tools/runqlat_example.txt | 11 +++--- tools/xfsdist_example.txt | 7 ++-- 7 files changed, 90 insertions(+), 110 deletions(-) diff --git a/docs/reference_guide.md b/docs/reference_guide.md index 352d4fdb3dd1..566f2c4c1228 100644 --- a/docs/reference_guide.md +++ b/docs/reference_guide.md @@ -1758,18 +1758,20 @@ Attaching 1 probe... ^C @bytes: -[0, 1] 7 |@@@@@@@@@@@@@ | -[2, 4) 3 |@@@@@ | -[4, 8) 8 |@@@@@@@@@@@@@@ | -[8, 16) 9 |@@@@@@@@@@@@@@@@ | -[16, 32) 0 | | -[32, 64) 1 |@ | -[64, 128) 1 |@ | -[128, 256) 0 | | -[256, 512) 3 |@@@@@ | -[512, 1k) 0 | | -[1k, 2k) 12 |@@@@@@@@@@@@@@@@@@@@@@ | -[2k, 4k) 28 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +(..., 0) 117 |@@@@@@@@@@@@ | +[0] 5 | | +[1] 325 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[2, 4) 6 | | +[4, 8) 3 | | +[8, 16) 495 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[16, 32) 35 |@@@ | +[32, 64) 25 |@@ | +[64, 128) 21 |@@ | +[128, 256) 1 | | +[256, 512) 3 | | +[512, 1K) 2 | | +[1K, 2K) 1 | | +[2K, 4K) 2 | | ``` ### 8.2. Power-Of-2 By Key: @@ -1786,11 +1788,18 @@ Attaching 1 probe... [2, 4) 9 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @bytes[snmpd]: -[0, 1] 1 |@@@@ | +[1] 1 |@@@@ | [2, 4) 0 | | [4, 8) 0 | | [8, 16) 4 |@@@@@@@@@@@@@@@@@@ | [16, 32) 11 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| + +@bytes[irqbalance]: +(..., 0) 15 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[0] 0 | | +[1] 0 | | +[2, 4) 0 | | +[4, 8) 21 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| ``` ## 9. `lhist()`: Linear Histogram @@ -1898,18 +1907,20 @@ Attaching 1 probe... ^C @bytes: -[0, 1] 7 |@@@@@@@@@@@@@ | -[2, 4) 3 |@@@@@ | -[4, 8) 8 |@@@@@@@@@@@@@@ | -[8, 16) 9 |@@@@@@@@@@@@@@@@ | -[16, 32) 0 | | -[32, 64) 1 |@ | -[64, 128) 1 |@ | -[128, 256) 0 | | -[256, 512) 3 |@@@@@ | -[512, 1k) 0 | | -[1k, 2k) 12 |@@@@@@@@@@@@@@@@@@@@@@ | -[2k, 4k) 28 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +(..., 0) 117 |@@@@@@@@@@@@ | +[0] 5 | | +[1] 325 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | +[2, 4) 6 | | +[4, 8) 3 | | +[8, 16) 495 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[16, 32) 35 |@@@ | +[32, 64) 25 |@@ | +[64, 128) 21 |@@ | +[128, 256) 1 | | +[256, 512) 3 | | +[512, 1K) 2 | | +[1K, 2K) 1 | | +[2K, 4K) 2 | | ``` Histograms can also be printed on-demand, using the print() function. Eg: diff --git a/src/ast/codegen_llvm.cpp b/src/ast/codegen_llvm.cpp index 771c4e539ffa..e1e0e3f9a53d 100644 --- a/src/ast/codegen_llvm.cpp +++ b/src/ast/codegen_llvm.cpp @@ -1372,10 +1372,18 @@ Value *CodegenLLVM::createLogicalOr(Binop &binop) void CodegenLLVM::createLog2Function() { + // log2() returns a bucket index for the given value. Index 0 is for + // values less than 0, index 1 is for 0, and indexes 2 onwards is the + // power-of-2 histogram index. + // // log2(int n) // { // int result = 0; // int shift; + // if (n < 0) return result; + // result++; + // if (n == 0) return result; + // result++; // for (int i = 4; i >= 0; i--) // { // shift = (v >= (1<<(1<getContext(), "entry", log2_func); b_.SetInsertPoint(entry); + // setup n and result registers Value *arg = log2_func->arg_begin(); - Value *n_alloc = b_.CreateAllocaBPF(SizedType(Type::integer, 8)); b_.CreateStore(arg, n_alloc); - Value *result = b_.CreateAllocaBPF(SizedType(Type::integer, 8)); b_.CreateStore(b_.getInt64(0), result); + // test for less than zero + BasicBlock *is_less_than_zero = BasicBlock::Create(module_->getContext(), "hist.is_less_than_zero", log2_func); + BasicBlock *is_not_less_than_zero = BasicBlock::Create(module_->getContext(), "hist.is_not_less_than_zero", log2_func); + b_.CreateCondBr(b_.CreateICmpSLT(b_.CreateLoad(n_alloc), b_.getInt64(0)), + is_less_than_zero, + is_not_less_than_zero); + b_.SetInsertPoint(is_less_than_zero); + b_.CreateRet(b_.CreateLoad(result)); + b_.SetInsertPoint(is_not_less_than_zero); + + // test for equal to zero + BasicBlock *is_zero = BasicBlock::Create(module_->getContext(), "hist.is_zero", log2_func); + BasicBlock *is_not_zero = BasicBlock::Create(module_->getContext(), "hist.is_not_zero", log2_func); + b_.CreateCondBr(b_.CreateICmpEQ(b_.CreateLoad(n_alloc), b_.getInt64(0)), + is_zero, + is_not_zero); + b_.SetInsertPoint(is_zero); + b_.CreateStore(b_.getInt64(1), result); + b_.CreateRet(b_.CreateLoad(result)); + b_.SetInsertPoint(is_not_zero); + + // power-of-2 index, offset by +2 + b_.CreateStore(b_.getInt64(2), result); for (int i = 4; i >= 0; i--) { Value *n = b_.CreateLoad(n_alloc); diff --git a/src/bpftrace.cpp b/src/bpftrace.cpp index eb4bb56d6f69..aebd5bcee138 100644 --- a/src/bpftrace.cpp +++ b/src/bpftrace.cpp @@ -1123,12 +1123,20 @@ int BPFtrace::print_hist(const std::vector &values, uint32_t div) cons std::ostringstream header; if (i == 0) { - header << "[0, 1]"; + header << "(..., 0)"; + } + else if (i == 1) + { + header << "[0]"; + } + else if (i == 2) + { + header << "[1]"; } else { - header << "[" << hist_index_label(i); - header << ", " << hist_index_label(i+1) << ")"; + header << "[" << hist_index_label(i-2); + header << ", " << hist_index_label(i-2+1) << ")"; } int max_width = 52; diff --git a/tools/biolatency_example.txt b/tools/biolatency_example.txt index b1be38a01712..f08312f870a2 100644 --- a/tools/biolatency_example.txt +++ b/tools/biolatency_example.txt @@ -9,14 +9,6 @@ Tracing block device I/O... Hit Ctrl-C to end. ^C @usecs: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | [256, 512) 2 | | [512, 1K) 10 |@ | [1K, 2K) 426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| diff --git a/tools/bitesize_example.txt b/tools/bitesize_example.txt index b34d40182cbf..d01bb986dd3c 100644 --- a/tools/bitesize_example.txt +++ b/tools/bitesize_example.txt @@ -11,55 +11,20 @@ Tracing block device I/O... Hit Ctrl-C to end. I/O size (bytes) histograms by process name: @[cleanup]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | [4K, 8K) 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @[postdrop]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | [4K, 8K) 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @[jps]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | [4K, 8K) 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@ | [8K, 16K) 0 | | [16K, 32K) 0 | | [32K, 64K) 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @[kworker/2:1H]: -[0, 1] 3 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[0] 3 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[1] 0 | | [2, 4) 0 | | [4, 8) 0 | | [8, 16) 0 | | @@ -78,18 +43,6 @@ I/O size (bytes) histograms by process name: [64K, 128K) 1 |@@@@@@@@@@@@@@@@@ | @[jbd2/nvme0n1-8]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | [4K, 8K) 3 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [8K, 16K) 0 | | [16K, 32K) 0 | | @@ -97,20 +50,6 @@ I/O size (bytes) histograms by process name: [64K, 128K) 1 |@@@@@@@@@@@@@@@@@ | @[dd]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | -[8, 16) 0 | | -[16, 32) 0 | | -[32, 64) 0 | | -[64, 128) 0 | | -[128, 256) 0 | | -[256, 512) 0 | | -[512, 1K) 0 | | -[1K, 2K) 0 | | -[2K, 4K) 0 | | -[4K, 8K) 0 | | -[8K, 16K) 0 | | [16K, 32K) 921 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| The most active process while tracing was "dd", which issues 921 I/O between diff --git a/tools/runqlat_example.txt b/tools/runqlat_example.txt index 0814fa5dc3fc..c79ecef43622 100644 --- a/tools/runqlat_example.txt +++ b/tools/runqlat_example.txt @@ -13,7 +13,8 @@ Tracing CPU scheduler... Hit Ctrl-C to end. @usecs: -[0, 1] 12 |@@ | +[0] 1 | | +[1] 11 |@@ | [2, 4) 16 |@@@ | [4, 8) 43 |@@@@@@@@@@ | [8, 16) 134 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | @@ -57,7 +58,7 @@ Tracing CPU scheduler... Hit Ctrl-C to end. @usecs: -[0, 1] 6 |@@@ | +[1] 6 |@@@ | [2, 4) 26 |@@@@@@@@@@@@@ | [4, 8) 97 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [8, 16) 72 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | @@ -93,7 +94,8 @@ Tracing CPU scheduler... Hit Ctrl-C to end. @usecs: -[0, 1] 9 |@@@ | +[0] 1 | | +[1] 8 |@@@ | [2, 4) 28 |@@@@@@@@@@@@ | [4, 8) 95 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [8, 16) 120 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @@ -127,7 +129,8 @@ Tracing CPU scheduler... Hit Ctrl-C to end. @usecs: -[0, 1] 12 |@ | +[0] 2 | | +[1] 10 |@ | [2, 4) 38 |@@@@ | [4, 8) 63 |@@@@@@ | [8, 16) 106 |@@@@@@@@@@@ | diff --git a/tools/xfsdist_example.txt b/tools/xfsdist_example.txt index e96c39ab95b8..71e411a3125a 100644 --- a/tools/xfsdist_example.txt +++ b/tools/xfsdist_example.txt @@ -10,14 +10,11 @@ Tracing XFS operation latency... Hit Ctrl-C to end. ^C @us[xfs_file_write_iter]: -[0, 1] 0 | | -[2, 4) 0 | | -[4, 8) 0 | | [8, 16) 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@ | [16, 32) 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @us[xfs_file_read_iter]: -[0, 1] 724 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[1] 724 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [2, 4) 137 |@@@@@@@@@ | [4, 8) 143 |@@@@@@@@@@ | [8, 16) 37 |@@ | @@ -37,7 +34,7 @@ Tracing XFS operation latency... Hit Ctrl-C to end. [128K, 256K) 6 | | @us[xfs_file_open]: -[0, 1] 1819 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| +[1] 1819 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [2, 4) 272 |@@@@@@@ | [4, 8) 0 | | [8, 16) 9 | |