BCC是基于eBPF的一套内核探测工具,如cachestat可以探测Linux文件系统缓存命中率和状态。
虽然官方文档中给出了使用软件包的方式直接安装,但是安装好后部分工具无法正常使用。
参照文档从源码安装是最稳妥的做法。
参考:https://blog.csdn.net/weixin_42306122/article/details/104935911
有两种安装方法:源码编译安装及apt安装
参考:https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source
sudo apt-get autoremove bpfcc-tools linux-headers-$(uname -r) python-bpfcc libbpfcc
sudo apt-get install bpfcc-tools linux-headers-$(uname -r) python-bpfcc libbpfcc
sudo /usr/share/bcc/tools/cachestat 1 3
github地址:https://github.com/iovisor/bcc.git
sudo apt-get -y install zip bison build-essential cmake flex git libedit-dev \
libllvm6.0 llvm-6.0-dev libclang-6.0-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev arping netperf iperf
上面是官方给出的,由于llvm和clang版本太低(6.0),编译会报错:
/tmp/bcc/src/cc/bpf_module.cc: In member function 'virtual void ebpf::MyMemoryManager::notifyObjectLoaded(llvm::ExecutionEngine*, const llvm::object::ObjectFile&)':
/tmp/bcc/src/cc/bpf_module.cc:117:46: error: no matching function for call to 'llvm::object::SectionRef::getName() const'
117 | auto sec_name = section.get()->getName();
若llvm和clang版本是10,也会报错:
/usr/bin/ld: /usr/lib/llvm-10/lib/libclangCodeGen.a(BackendUtil.cpp.o): in function `(anonymous namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >)':
(.text._ZN12_GLOBAL__N_118EmitAssemblyHelper30EmitAssemblyWithNewPassManagerEN5clang13BackendActionESt10unique_ptrIN4llvm17raw_pwrite_streamESt14default_deleteIS5_EE+0x1f15): undefined reference to `getPollyPluginInfo()'
collect2: error: ld returned 1 exit status
根据issue4008,使用12版的llvm和clang:
更新apt源:
printf "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main" |sudo tee /etc/apt/sources.list.d/llvm-toolchain-bionic-12.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key |sudo apt-key add -
sudo apt-get update
sudo apt-get install llvm-12
安装llvm及clang:
sudo apt-get install llvm-12
sudo apt-get install libclang-12-dev
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100
# sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 99
最后一个数字100表示优先级,数字越大优先级越高,比如上面两行命令同时输入的的话,最终的python使用的是python3,而不是python2.7,如果要切换回python2.7,将后面的数字调大即可(比如设置成101,大于python3的100)。
git clone https://github.com/iovisor/bcc.git
cd bcc
mkdir build
cd build
cmake ..
make -j5
sudo make install
cmake -DPYTHON_CMD=python3 ..
pushd src/python/
make -j5
sudo make install
popd
安装好后将包加入到python路径:
export PYTHONPATH=/usr/lib/python3/dist-packages:${PYTHONPATH}
cd /usr/share/bcc/tools
sudo ./cachestat 1 3
如果报以下错误:
(base) yangxiaokai@noa-Precision-Tower-7910:/usr/share/bcc/tools$ sudo ./cachestat 1 3
Traceback (most recent call last):
File "./cachestat", line 22, in <module>
from bcc import BPF
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 27, in <module>
from .libbcc import lib, bcc_symbol, bcc_symbol_option, bcc_stacktrace_build_id, _SYM_CB_TYPE
File "/usr/lib/python3/dist-packages/bcc/libbcc.py", line 20, in <module>
lib.bpf_module_create_b.restype = ct.c_void_p
File "/usr/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
func = self.__getitem__(name)
File "/usr/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b
解决方法:将源码编译的libbcc.so等动态库拷贝到python3的库中:
参考:AttributeError: /lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b
sudo cp -r build/src/cc/* /usr/lib/python3/dist-packages/bcc/
解决后继续运行sudo ./cachestat 1 3
命令,如果报以下错误:
Traceback (most recent call last):
File "./cachestat", line 22, in <module>
from bcc import BPF
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 27, in <module>
from .libbcc import lib, bcc_symbol, bcc_symbol_option, bcc_stacktrace_build_id, _SYM_CB_TYPE
ImportError: dynamic module does not define module export function (PyInit_libbcc)
一般是环境问题,重新安装