【Ceph】Ceph 进阶系列(一):Ceph日志和调试|日志代码

目录

即看即用

1 运行时

2 启动时

3 加速日志更迭

4 子系统、日志和调试设置

详细说明


一、即看即用

1 已经运行临时激活

a查看配置

查看OSD的配置:

ceph daemon osd.2 config show | less  #.2 是OSD 的id

查看 mgr 、 mon 或 mds的配置:

ceph daemon mon.rdma55  config show | less  #.rdma55 是ID

ceph daemon mgr.rdma55  config show | less  #.rdma55 是ID

ceph daemon mds.rdma55  config show | less  #.rdma55 是ID

osd 、mgr 、 mon 或 mdsID 查看方式:

查看osd 的ID:

[root@rdma55 ~]# ps -aux|grep -E "ceph-osd"|grep -v "grep"
ceph 2382201 /opt/h3c/bin/ceph-osd --cluster=ceph -i 2
ceph 2382343 /opt/h3c/bin/ceph-osd --cluster=ceph -i 9
ceph 2382487 /opt/h3c/bin/ceph-osd --cluster=ceph -i 15
ceph 2382632 /opt/h3c/bin/ceph-osd --cluster=ceph -i 22
ceph 2382835 /opt/h3c/bin/ceph-osd --cluster=ceph -i 28
ceph 2383021 /opt/h3c/bin/ceph-osd --cluster=ceph -i 32

-i 后面的就是ID

查看mgr 、 mon 或 mds的ID:

[root@rdma55 ~]# ps -aux|grep -E "ceph-mgr|ceph-mon|ceph-mds"|grep -v "grep"
ceph 2268447 /opt/h3c/bin/ceph-mon -f --id rdma55
ceph 3384811 /opt/h3c/bin/ceph-mgr -f --id rdma55

-i d后面的就是ID

查看配置语法说明

运行时执行下列命令,用 osd 、 mon 或 mds 替代 {daemon-type}:

ceph daemon {daemon-name} config show | less
例如: 

ceph daemon osd.0 config show | less

b激活 Ceph 的调试输出(dout()

例子:

  ceph tell osd.0 injectargs --debug-osd 0/5

  ceph tell osd.4 injectargs --debug-ms 15/15

语法说明:

ceph  tell 命令把参数注入运行时配置:

    ceph tell {daemon-type}.{daemon id or *} injectargs --{name} {value} [--{name} {value}]


用 osd 、 mon 或 mds 替代 {daemon-type} 。 *  同类型的所有守护进程,id:指定具体守护进程。例如:

    ceph tell osd.0 injectargs --debug-osd 0/5

   ceph tell osd.4 injectargs --debug-ms 15/15


ceph tell 命令会通过 monitor 起作用。如果你不能绑定 monitor,仍可以登录你要改的那台主机然后用 ceph daemon 来更改。例如:

    sudo ceph daemon osd.0 config set debug_osd 0/5

2 配置文件激活日志

激活 Ceph 的调试输出(dout()

把选项加入配置文件, [global] 段:各进程共有, [mon] 、 [osd] 、 [mds] :某类进程的配置。例如:

    [global]
            debug ms = 1/5
 
    [mon]
            debug mon = 20
            debug paxos = 1/5
            debug auth = 2
 
    [osd]
            debug osd = 1/5
            debug filestore = 1/5
            debug journal = 1
            debug monc = 5/20
 
    [mds]
            debug mds = 1
            debug mds balancer = 1
            debug mds log = 1
            debug mds migrator = 1

4 日志等级设置(log等级和内存等级)

 
分为:日志文件(log file level)和 内存日志(memory level)

子系统(ms、osd、rdb等)二者可以设置为统一级别,也可以分别为不同级别(用正斜杠(/)分隔它们)。如下:

debug {subsystem} = {log-level}/{memory-level}

#for example

#日志文件级别 和 内存日志级别都设置成5
debug ms = 5

#日志文件级别设置为1,内存日志级别设置为5

debug ms = 1/5

3 日志切割轮转

logrotate是linux下负责检查日志和切割轮转的服务,它的配置文件在 /etc/logrotate.d/目录下,/etc/logrotate.d/ceph是ceph添加的配置,

例如默认配置大致如此:

    rotate 7
    weekly
    compress
    sharedscripts

增加一个 size 选项,表示当日志的size达到500M就执行切割和轮转(  rotate 7只保留最近7个日志文件)

    rotate 7
    weekly
    size 500M
    compress
    sharedscripts

然后,打开 crontab 编辑器。

    crontab -e
最后,增加一条用以检查 /etc/logrorate.d/ceph 文件的语句。

    30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1

本例中每 30 分钟检查一次 /etc/logrorate.d/ceph 文件。

二、详细说明

官网原文:日志记录和调试 — Ceph Documentation

内容:

Ceph日志分类(一个分两类log file level和memory level)、怎么设置日志级别、日志存在哪个目录等

日志记录和调试

一般来说,你应该在运行时增加调试选项来调试问题;也可以把调试选项添加到 Ceph 配置文件里来调试启动问题,然后查看 /var/log/ceph (默认位置)下的日志文件。

Tip

调试输出会拖慢系统,这种延时有可能掩盖竞争条件。

日志记录是资源密集任务。如果你碰到的问题在集群的某个特定区域,只启用那个区域对应的日志功能即可。例如,你的 OSD 运行良好、元数据服务器却不行,这时应该先打开那个可疑元数据服务器例程的调试日志;如果不行再打开各子系统的日志。

Important

详尽的日志每小时可能超过 1GB ,如果你的系统盘满了,这个节点就会停止工作。

如果你要打开或增加 Ceph 日志级别,确保系统盘空间足够。滚动日志文件的方法见加快日志更迭。集群稳定运行后,可以关闭不必要的调试选项以更好地运行。在运营中记录调试输出会拖慢系统、且浪费资源。

可用选项参见子系统、日志和调试选项

运行时

如果你想查看一进程的运行时配置,必须先登录对应主机,然后执行命令:

ceph daemon {daemon-name} config show | less

例如:

ceph daemon osd.0 config show | less

要在运行时激活 Ceph 的调试输出(即 dout() ),用 ceph tell 命令把参数注入运行时配置:

ceph tell {daemon-type}.{daemon id or *} injectargs --{name} {value} [--{name} {value}]

用 osd 、 mon 或 mds 替代 {daemon-type} 。你可以用星号( * )把配置应用到同类型的所有守护进程,或者指定具体守护进程的 ID 。例如,要给名为 ods.0 的 ceph-osd 守护进程提高调试级别,用下列命令:

ceph tell osd.0 injectargs --debug-osd 0/5

ceph tell 命令会贯穿所有监视器。如果你不能绑定监视器,还可以登录你要改的那台主机用 ceph daemon 来更改。例如:

sudo ceph daemon osd.0 config set debug_osd 0/5

可用选项参见子系统、日志和调试选项

启动时

要在启动时激活调试输出( dout() ),你得把选项加入配置文件。各进程共有配置可写在配置文件的 [global] 下,某类进程的配置可写在守护进程段下( [mon] 、 [osd] 、 [mds] )。例如:

[global]
        debug ms = 1/5

[mon]
        debug mon = 20
        debug paxos = 1/5
        debug auth = 2

[osd]
        debug osd = 1/5
        debug filestore = 1/5
        debug journal = 1
        debug monc = 5/20

[mds]
        debug mds = 1
        debug mds balancer = 1
        debug mds log = 1
        debug mds migrator = 1

可用选项参见子系统、日志和调试选项

加快日志更迭

如果你的系统盘比较满,可以修改 /etc/logrotate.d/ceph 内的日志滚动配置以加快滚动。在滚动频率后增加一个尺寸选项(达到此尺寸就滚动)来加快滚动(通过 cronjob )。例如默认配置大致如此:

rotate 7
weekly
compress
sharedscripts

增加一个 size 选项。

rotate 7
weekly
size 500M
compress
sharedscripts

然后,打开 crontab 编辑器。

crontab -e

最后,增加一条用以检查 /etc/logrorate.d/ceph 文件。

30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1

本例中每 30 分钟检查一次 /etc/logrorate.d/ceph 文件。

VALGRIND

你也许还得追踪内存和线程问题,可以在 Valgrind 中运行一个守护进程、一类进程、或整个集群。 Valgrind 是计算密集型程序,应该只用于开发或调试,否则会拖慢系统。其消息记录到 stderr 。

子系统、日志和调试选项

大多数情况下你可以通过子系统打开调试。

CEPH 子系统概览

各子系统都有日志级别用于分别控制其输出日志、和暂存日志,你可以分别为这些子系统设置不同的记录级别。 Ceph 的日志级别从 1 到 20 , 1 是简洁、 20 是详尽。通常,内存驻留日志不会发送到输出日志,除非:

  • 致命信号冒出来了,或者
  • 源码中的 assert 被触发,或者
  • 明确要求发送。详情见管理套接字文档 。

调试选项允许用单个数字同时设置日志级别和内存级别,会设置为一样。比如,如果你指定 debug ms = 5 , Ceph 会把日志级别和内存级别都设置为 5 。也可以分别设置,第一个选项是日志级别、后一个是内存级别,二者必须用斜线( / )分隔。假如你想把 ms 子系统的调试日志级别设为 1 、内存级别设为 5 ,可以写为 debug ms = 1/5 ,如下:

debug {subsystem} = {log-level}/{memory-level}
#for example
debug mds log = 1/20
 


代码中如何使用日志

举例

在config_opts.h中的SUBSYS(ms, 0, 5)定义了ceph_debug_ms的日志级别为log_level=0,gather_level=5;

ms模块使用ldout(msgr->cct, 1) << __func__ << " start" << dendl;打印日志,其中1表示本条日志的log_level=gather_level=1;

为了方便描述分别表示为:

ms.log_level = 0;

ms.gather_level = 5;

ldout.log_level = 1;

ldout.gather = 1;

因为ms.gather_level > ldout.gather,所以本条日志会记录在内存中。

因为ms.log_level < ldout.log_level,所以本条日志不会记录到日志文件中。

但是Ceph中提供了ceph daemon type.id log dump命令可以把内存中的日志刷入日志文件中,并且不受log_level影响。

ceph日志代码分析

https://daimajiaoliu.com/daima/485fd296c900408

附录

下表列出了 Ceph 子系统及其默认日志和内存级别。一旦你完成调试,应该恢复默认值、或一个适合平常运营的级别。

子系统日志级别内存日志级别
default05
lockdep05
context05
crush15
mds15
mds balancer15
mds locker15
mds log15
mds log expire15
mds migrator15
buffer00
timer05
filer05
objecter00
rados05
rbd05
journaler05
objectcacher05
client05
osd05
optracker05
objclass05
filestore15
journal15
ms05
mon15
monc05
paxos05
tp05
auth15
finisher15
heartbeatmap15
perfcounter15
rgw15
javaclient15
asok15
throttle15

日志记录选项

日志和调试选项不是必需配置,但你可以按需覆盖默认值。 Ceph 支持如下配置:

log file

描述:集群日志文件的位置。
类型:String
是否必需:No
默认值:/var/log/ceph/$cluster-$name.log

log max new

描述:新日志文件的最大数量。
类型:Integer
是否必需:No
默认值:1000

log max recent

描述:一个日志文件包含的最新事件的最大数量。
类型:Integer
是否必需:No
默认值:1000000

log to stderr

描述:设置日志消息是否输出到标准错误( stderr )。
类型:Boolean
是否必需:No
默认值:true

err to stderr

描述:设置错误消息是否输出到标准错误( stderr )。
类型:Boolean
是否必需:No
默认值:true

log to syslog

描述:设置日志消息是否输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false

err to syslog

描述:设置错误消息是否输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false

log flush on exit

描述:设置 Ceph 退出后是否回写日志文件。
类型:Boolean
是否必需:No
默认值:true

clog to monitors

描述:设置是否把 clog 消息发送给监视器。
类型:Boolean
是否必需:No
默认值:true

clog to syslog

描述:设置是否把 clog 输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false

mon cluster log to syslog

描述:设置集群日志是否输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false

mon cluster log file

描述:集群日志位置。
类型:String
是否必需:No
默认值:/var/log/ceph/$cluster.log

OSD

osd debug drop ping probability

描述:?
类型:Double
是否必需:No
默认值:0

osd debug drop ping duration

描述:
类型:Integer
是否必需:No
默认值:0

osd debug drop pg create probability

描述:
类型:Integer
是否必需:No
默认值:0

osd debug drop pg create duration

描述:?
类型:Double
是否必需:No
默认值:1

osd preserve trimmed log

描述:裁减后保留剩余日志。
类型:Boolean
是否必需:No
默认值:false

osd tmapput sets uses tmap

描述:使用 tmap ,仅用于调试。
类型:Boolean
是否必需:No
默认值:false

osd min pg log entries

描述:归置组日志最小条数。
类型:32-bit Unsigned Integer
是否必需:No
默认值:1000

osd op log threshold

描述:一次发送多少操作日志消息。
类型:Integer
是否必需:No
默认值:5

FILESTORE

filestore debug omap check

描述:调试同步检查,这是昂贵的操作。
类型:Boolean
是否必需:No
默认值:0

MDS

mds debug scatterstat

描述:Ceph 将把各种回归状态常量设置为真(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false

mds debug frag

描述:Ceph 将在方便时校验目录碎片(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false

mds debug auth pins

描述:debug auth pin 开关(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false

mds debug subtrees

描述:debug subtree 开关(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false

RADOS 网关

rgw log nonexistent bucket

描述:记录不存在的桶?
类型:Boolean
是否必需:No
默认值:false

rgw log object name

描述:是否记录对象名称。注:关于格式参考 man date ,子集也支持。
类型:String
是否必需:No
默认值:%Y-%m-%d-%H-%i-%n

rgw log object name utc

描述:对象日志名称包含 UTC ?
类型:Boolean
是否必需:No
默认值:false

rgw enable ops log

描述:允许记录 RGW 的每一个操作。
类型:Boolean
是否必需:No
默认值:true

rgw enable usage log

描述:允许记录 RGW 的带宽使用。
类型:Boolean
是否必需:No
默认值:true

rgw usage log flush threshold

描述:回写未决的日志数据阀值。
类型:Integer
是否必需:No
默认值:1024

rgw usage log tick interval

描述:每隔 s 回写一次未决日志。
类型:Integer
是否必需:No
默认值:30

rgw intent log object name

描述:
类型:String
是否必需:No
默认值:%Y-%m-%d-%i-%n

rgw intent log object name utc

描述:日志对象名字里包含 UTC 时间戳。
类型:Boolean
是否必需:No
默认值:false

Ceph 的日志级别范围是 1~20 , 1 是简洁、 20 是详细。通常,内存驻留日志不会发送到输出日志,除非:

致命信号出现,或者
源码中的 assert 被触发,或者
明确要求发送。
Ceph 子系统及其默认日志和内存级别具体见Ceph官方文档 SUBSYSTEM, LOG AND DEBUG SETTINGS 。一旦你完成调试,应该恢复默认值,或一个适合平常运营的级别。

下表列出了CEPH子系统的 默认日志级别 和内存日志级别。你可以在完成日志记录工作后,将子系统恢复到默认级别或适合正常操作的级别。 

(图表见原文)
原文链接:https://blog.csdn.net/don_chiang709/article/details/95628708

posted on 2022-10-04 01:23  bdy  阅读(294)  评论(0编辑  收藏  举报

导航