You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译启用LTTng-UST支持后Ceph Tracepoints缺失问题求助

问题:编译带LTTng支持的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:24:52