日志记录和调试

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

Tip

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

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

Important

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

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

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

运行时

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

  1. ceph daemon {daemon-name} config show | less

例如:

  1. ceph daemon osd.0 config show | less

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

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

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

  1. ceph tell osd.0 injectargs --debug-osd 0/5
cephtell 命令会贯穿所有监视器。如果你不能绑定监视器,还可以登录你要改的那台主机用 cephdaemon 来更改。例如:
  1. sudo ceph daemon osd.0 config set debugosd 0/5
可用选项参见子系统、日志和调试选项。## 启动时要在启动时激活调试输出(dout() ),你得把选项加入配置文件。各进程共有配置可写在配置文件的 [global] 下,某类进程的配置可写在守护进程段下(如_[mon][osd][mds] )。例如:
  1. [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 )。例如默认配置大致如此:
  1. rotate 7weeklycompresssharedscripts
增加一个 size 选项。
  1. rotate 7weeklysize 500Mcompresssharedscripts
然后,打开 crontab 编辑器。
  1. crontab -e
最后,增加一条用以检查 /etc/logrorate.d/ceph 文件。
  1. 30 /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1
本例中每 30 分钟检查一次 /etc/logrorate.d/ceph 文件。## Valgrind你也许还得追踪内存和线程问题,可以在 Valgrind 中运行一个守护进程、一类进程、或整个集群。 Valgrind 是计算密集型程序,应该只用于开发或调试,否则会拖慢系统。其消息记录到 stderr 。## 子系统、日志和调试选项大多数情况下你可以通过子系统打开调试。### Ceph 子系统概览各子系统都有日志级别用于分别控制其输出日志、和暂存日志,你可以分别为这些子系统设置不同的记录级别。 Ceph 的日志级别从 1201 是简洁、 20 是详尽。通常,内存驻留日志不会发送到输出日志,除非:- 致命信号冒出来了,或者- 源码中的 assert 被触发,或者- 明确要求发送。详情见管理套接字文档 。调试选项允许用单个数字同时设置日志级别和内存级别,会设置为一样。比如,如果你指定 debugms=5 , Ceph 会把日志级别和内存级别都设置为 5 。也可以分别设置,第一个选项是日志级别、后一个是内存级别,二者必须用斜线( / )分隔。假如你想把 ms 子系统的调试日志级别设为 1 、内存级别设为 5 ,可以写为 debugms=1/5 ,如下:
  1. debug {subsystem} = {log-level}/{memory-level}#for exampledebug mds log = 1/20
下表列出了 Ceph 子系统及其默认日志和内存级别。一旦你完成调试,应该恢复默认值、或一个适合平常运营的级别。
子系统日志级别内存日志级别
default05
lockdep05
context05
crush15
mds15
mdsbalancer15
mdslocker15
mdslog15
mdslogexpire15
mdsmigrator15
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 支持如下配置:logfile
描述:集群日志文件的位置。
类型:String
是否必需:No
默认值:/var/log/ceph/$cluster-$name.log
logmaxnew
描述:新日志文件的最大数量。
类型:Integer
是否必需:No
默认值:1000
logmaxrecent
描述:一个日志文件包含的最新事件的最大数量。
类型:Integer
是否必需:No
默认值:1000000
logtostderr
描述:设置日志消息是否输出到标准错误( stderr )。
类型:Boolean
是否必需:No
默认值:true
errtostderr
描述:设置错误消息是否输出到标准错误( stderr )。
类型:Boolean
是否必需:No
默认值:true
logtosyslog
描述:设置日志消息是否输出到 syslog
类型:Boolean
是否必需:No
默认值:false
errtosyslog
描述:设置错误消息是否输出到 syslog
类型:Boolean
是否必需:No
默认值:false
logflushonexit
描述:设置 Ceph 退出后是否回写日志文件。
类型:Boolean
是否必需:No
默认值:true
clogtomonitors
描述:设置是否把 clog 消息发送给监视器。
类型:Boolean
是否必需:No
默认值:true
clogtosyslog
描述:设置是否把 clog 输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false
monclusterlogtosyslog
描述:设置集群日志是否输出到 syslog 。
类型:Boolean
是否必需:No
默认值:false
monclusterlogfile
描述:集群日志位置。
类型:String
是否必需:No
默认值:/var/log/ceph/$cluster.log

OSD

osddebugdroppingprobability
描述:?
类型:Double
是否必需:No
默认值:0
osddebugdroppingduration
描述:
类型:Integer
是否必需:No
默认值:0
osddebugdroppgcreateprobability
描述:
类型:Integer
是否必需:No
默认值:0
osddebugdroppgcreateduration
描述:?
类型:Double
是否必需:No
默认值:1
osdpreservetrimmedlog
描述:裁减后保留剩余日志。
类型:Boolean
是否必需:No
默认值:false
osdtmapputsetsusestmap
描述:使用 tmap ,仅用于调试。
类型:Boolean
是否必需:No
默认值:false
osdminpglogentries
描述:归置组日志最小条数。
类型:32-bit Unsigned Integer
是否必需:No
默认值:1000
osdoplogthreshold
描述:一次发送多少操作日志消息。
类型:Integer
是否必需:No
默认值:5

Filestore

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

MDS

mdsdebugscatterstat
描述:Ceph 将把各种回归状态常量设置为真(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false
mdsdebugfrag
描述:Ceph 将在方便时校验目录碎片(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false
mdsdebugauthpins
描述:debug auth pin 开关(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false
mdsdebugsubtrees
描述:debug subtree 开关(谨为开发者)。
类型:Boolean
是否必需:No
默认值:false

RADOS 网关

rgwlognonexistentbucket
描述:记录不存在的桶?
类型:Boolean
是否必需:No
默认值:false
rgwlogobjectname
描述:是否记录对象名称。注:关于格式参考 mandate ,子集也支持。
类型:String
是否必需:No
默认值:%Y-%m-%d-%H-%i-%n
rgwlogobjectnameutc
描述:对象日志名称包含 UTC ?
类型:Boolean
是否必需:No
默认值:false
rgwenableopslog
描述:允许记录 RGW 的每一个操作。
类型:Boolean
是否必需:No
默认值:true
rgwenableusagelog
描述:允许记录 RGW 的带宽使用。
类型:Boolean
是否必需:No
默认值:true
rgwusagelogflushthreshold
描述:回写未决的日志数据阀值。
类型:Integer
是否必需:No
默认值:1024
rgwusagelogtickinterval
描述:每隔 s 回写一次未决日志。
类型:Integer
是否必需:No
默认值:30
rgwintentlogobjectname
描述:
类型:String
是否必需:No
默认值:%Y-%m-%d-%i-%n
rgwintentlogobjectnameutc
描述:日志对象名字里包含 UTC 时间戳。
类型:Boolean
是否必需:No
默认值:false