编译启用LTTng-UST支持后Ceph Tracepoints缺失问题求助
我尝试用LTTng-UST追踪Ceph,按步骤编译了带LTTng支持的Ceph,也预加载了liblttng-ust-fork.so,但执行lttng list -u只显示lttng_ust_lib:*这类通用tracepoints,看不到pg:queue_op等Ceph业务相关的tracepoints。
已执行的编译步骤(启用LTTng)
# 更新软件源并安装依赖 sudo apt update sudo apt install dpkg-dev devscripts -y sudo apt install lttng-tools lttng-modules-dkms liblttng-ust-dev libbabeltrace-dev # 获取Ceph源码 apt source ceph # 安装编译依赖 sudo apt build-dep ceph # 进入源码目录 cd ceph-<version> # 编辑构建规则启用LTTng nano debian/rules # 添加以下内容: extraopts += -DWITH_LTTNG=ON extraopts += -DWITH_OSD_INSTRUMENT_FUNCTIONS=ON # 构建Ceph包 DEB_BUILD_OPTIONS=nocheck DEB_CMAKE_EXTRA_ARGS="-DWITH_LTTNG=ON" dpkg-buildpackage -uc -us # 安装编译好的包 sudo dpkg -i ../ceph*.deb # 修复依赖问题 sudo apt install -f
手动部署Ceph集群的脚本
#!/bin/bash # 变量配置 INTERFACE="ens34" HOSTNAME=$(hostname) MON_IP="192.168.1.10" MON_IP_MASK="255.255.255.0" PUBLIC_NETWORK="192.168.1.0/24" FSID=$(uuidgen) MANAGER_NAME="mgr1" DISK1="sda" DISK2="sdb" # 配置静态IP sudo bash -c "cat >> /etc/network/interfaces" <<EOF auto ${INTERFACE} iface ${INTERFACE} inet static address ${MON_IP} netmask ${MON_IP_MASK} EOF sudo systemctl restart networking # --------------------------------------------------------------------------------------------------- # 创建Ceph配置文件 sudo bash -c "cat > /etc/ceph/ceph.conf" <<EOF [global] fsid = ${FSID} mon_initial_members = ${HOSTNAME} mon_host = ${MON_IP} public_network = ${PUBLIC_NETWORK} auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx osd_pool_default_size = 2 osd_pool_default_min_size = 2 EOF # 生成密钥环 sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *' sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *' sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r' # 将密钥导入ceph.mon.keyring sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring sudo chown ceph:ceph /tmp/ceph.mon.keyring # 生成monmap sudo monmaptool --create --add ${HOSTNAME} ${MON_IP} --fsid ${FSID} /tmp/monmap # 创建Monitor数据目录 sudo mkdir -p /var/lib/ceph/mon/ceph-${HOSTNAME} sudo chown -R ceph:ceph /var/lib/ceph/mon/ceph-${HOSTNAME} # 初始化Monitor sudo -u ceph ceph-mon --mkfs -i ${HOSTNAME} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring # 等待后启动Monitor sleep 4 # 启动Monitor sudo systemctl start ceph-mon@${HOSTNAME} # --------------------------------------------------------------------------------------------------- # 部署Manager echo "部署Manager: ${MANAGER_NAME}" # 1. 为Manager生成认证密钥 sudo ceph auth get-or-create mgr.${MANAGER_NAME} mon 'allow profile mgr' osd 'allow *' mds 'allow *' # 2. 创建Manager数据目录 sudo mkdir -p /var/lib/ceph/mgr/ceph-${MANAGER_NAME} # 3. 保存密钥环到目录 sudo bash -c "ceph auth get mgr.${MANAGER_NAME} > /var/lib/ceph/mgr/ceph-${MANAGER_NAME}/keyring" # 4. 设置权限 sudo chown -R ceph:ceph /var/lib/ceph/mgr/ceph-${MANAGER_NAME} # 5. 启动Manager守护进程 sudo -u ceph ceph-mgr -i ${MANAGER_NAME} # --------------------------------------------------------------------------------------------------- # 添加两个OSD echo "在/dev/${DISK1}和/dev/${DISK2}上创建OSD" # 准备并激活OSD sudo ceph-volume lvm create --data /dev/${DISK1} sudo ceph-volume lvm create --data /dev/${DISK2} # ---------------------------------------------------------------------------------------------------
查看Tracepoints的操作步骤
# 1. 列出UST事件初始状态 lttng list -u # 得到的结果: UST events: ------------- NONE # 2. 为Ceph守护进程预加载liblttng-ust-fork.so systemctl edit ceph-mon@debian # 添加的内容: [Service] Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/liblttng-ust-fork.so" # 3. 重启Ceph守护进程 systemctl restart ceph-mon@debian systemctl restart ceph-osd@debian systemctl restart ceph-mgr@debian # 4. 重启后再次查看事件 lttng list -u # 得到的结果: UST events: ------------- lttng_ust_lib:* lttng_ust_tracelog:* lttng_ust_statedump:* # 预期结果: UST events: ------------- PID: 100859 - Name: /path/to/ceph-osd pg:queue_op (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) osd:do_osd_op_post (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) osd:do_osd_op_pre_unknown (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) osd:do_osd_op_pre_copy_from (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint) osd:do_osd_op_pre_copy_get (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint)
排查与解决方法
1. 确认Ceph编译时确实启用了LTTng
编译完成后,检查Ceph二进制文件是否包含tracepoint符号:
# 检查ceph-osd是否有tracepoint符号 nm /usr/bin/ceph-osd | grep tracepoint
如果输出包含pg__queue_op、osd__do_osd_op_post这类符号,说明编译生效;如果没有,重新检查编译步骤:
- 确保
debian/rules中的extraopts += -DWITH_LTTNG=ON和-DWITH_OSD_INSTRUMENT_FUNCTIONS=ON确实被添加,且没有被其他配置覆盖 - 查看构建日志,确认
DEB_CMAKE_EXTRA_ARGS="-DWITH_LTTNG=ON"参数是否正确传递给CMake - 清理构建目录后重新编译:
dpkg-buildpackage -clean再重新执行构建命令
2. 为所有Ceph守护进程配置预加载
你仅给ceph-mon@debian添加了预加载,需要给OSD、MGR等所有相关守护进程都配置:
# 为OSD服务添加预加载 systemctl edit ceph-osd@<osd-id> # 添加同样的[Service]配置段 Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/liblttng-ust-fork.so" # 为MGR服务添加预加载 systemctl edit ceph-mgr@mgr1 # 同样添加配置段
或者直接修改Ceph全局systemd模板文件/lib/systemd/system/ceph@.service,在[Service]段添加预加载,确保所有Ceph守护进程生效。
3. 检查LTTng会话守护进程状态
确保lttng-sessiond正在运行:
systemctl status lttng-sessiond
如果未运行,启动并设置开机自启:
sudo systemctl start lttng-sessiond sudo systemctl enable lttng-sessiond
Ceph的tracepoints依赖该守护进程才能被探测到。
4. 验证守护进程的预加载环境变量
重启守护进程后,检查进程环境变量是否包含LD_PRELOAD:
# 替换<pid>为ceph-osd的进程ID cat /proc/<pid>/environ | tr '\0' '\n' | grep LD_PRELOAD
如果无输出,说明预加载配置未生效,可尝试手动启动守护进程测试:
# 手动启动ceph-osd并预加载 sudo LD_PRELOAD=/usr/lib/x86_64-linux-gnu/liblttng-ust-fork.so ceph-osd -i <osd-id>
之后再执行lttng list -u查看是否能识别Ceph tracepoints。
5. 调整Ceph日志级别
Ceph的tracepoints默认可能需要特定日志级别才能激活,在ceph.conf的[global]段添加:
debug_osd = 1/10 debug_pg = 1/10
重启所有守护进程后重新探测tracepoints。
6. 确认LTTng版本兼容性
确保LTTng工具和库的版本与Ceph编译时依赖的版本一致,版本不匹配会导致tracepoints无法识别:
lttng --version dpkg -l | grep liblttng-ust
内容的提问来源于stack exchange,提问作者Lina SADI

