1. 介紹
一般來說,你應(yīng)該在運行時增加調(diào)試選項來調(diào)試問題;也可以把調(diào)試選項添加到 Ceph 配置文件里來調(diào)試集群啟動時的問題,然后查看 /var/log/ceph (默認(rèn)位置)下的日志文件。
Tip: 調(diào)試輸出會拖慢系統(tǒng),這種延時有可能掩蓋競爭條件。
日志記錄是資源密集型任務(wù)。如果你碰到的問題在集群的某個特定區(qū)域,只啟用那個區(qū)域?qū)?yīng)的日志功能即可。例如,你的 OSD 運行良好、元數(shù)據(jù)服務(wù)器卻有問題,這時應(yīng)該先打開那個可疑元數(shù)據(jù)服務(wù)器實例的調(diào)試日志;如果不行再打開各子系統(tǒng)的日志。
重要: 詳盡的日志每小時可能超過 1GB ,如果你的系統(tǒng)盤滿了,這個節(jié)點就會停止工作。
如果你要打開或增加 Ceph 日志級別,確保有足夠的系統(tǒng)盤空間。滾動日志文件的方法見下面的 加快日志更迭 小節(jié)。集群穩(wěn)定運行后,可以關(guān)閉不必要的調(diào)試選項以優(yōu)化運行。集群在運行中記錄調(diào)試輸出信息會拖慢系統(tǒng)、且浪費資源。
2. 運行時
如果你想在運行時查看某一進(jìn)程的配置,必須先登錄對應(yīng)主機,然后執(zhí)行命令:
ceph daemon {daemon-name} config show | less
例如:
ceph daemon osd.0 config show | less
要在運行時激活 Ceph 的調(diào)試輸出(即 dout() ),用 ceph tell 命令把參數(shù)注入運行時配置:
ceph tell {daemon-type}.{daemon id or *} injectargs --{name} {value} [--{name} {value}]
用 osd 、 mon 或 mds 替代 {daemon-type} 。還可以用星號( * )把配置應(yīng)用到同類型的所有守護(hù)進(jìn)程,或者指定具體守護(hù)進(jìn)程的 ID 。例如,要給名為 ods.0 的 ceph-osd 守護(hù)進(jìn)程提高調(diào)試級別,用下列命令:
ceph tell osd.0 injectargs --debug-osd 0/5
ceph tell 命令會通過 monitor 起作用。如果你不能綁定 monitor,仍可以登錄你要改的那臺主機然后用 ceph daemon 來更改。例如:
sudo ceph daemon osd.0 config set debug_osd 0/5
3. 啟動時
要在啟動時激活調(diào)試輸出(即 dout() ),你得把選項加入配置文件。各進(jìn)程共有配置可寫在配置文件的 [global] 段下,某類進(jìn)程的配置可寫在對應(yīng)的守護(hù)進(jìn)程段下(如 [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. 加快日志更迭
如果你的系統(tǒng)盤比較滿,可以修改 /etc/logrotate.d/ceph 內(nèi)的日志滾動配置以加快滾動。在滾動頻率后增加一個日志 size 選項(達(dá)到此大小就滾動)來加快滾動(通過 cronjob )。例如默認(rèn)配置大致如此:
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 文件。
5. VALGRIND 工具
調(diào)試時可能還需要追蹤內(nèi)存和線程問題。你可以在 Valgrind 中運行單個守護(hù)進(jìn)程、一類進(jìn)程、或整個集群。 Valgrind 是計算密集型程序,應(yīng)該只用于開發(fā)或調(diào)試 Ceph,否則它會拖慢系統(tǒng)。Valgrind 的消息會記錄到 stderr 。
6. 子系統(tǒng)、日志和調(diào)試選項
大多數(shù)情況下,你可以通過子系統(tǒng)打開調(diào)試日志輸出。
6.1 CEPH 子系統(tǒng)概覽
各子系統(tǒng)都有日志級別用于分別控制其輸出日志和暫存日志(內(nèi)存中),你可以分別為這些子系統(tǒng)設(shè)置不同的記錄級別。 Ceph 的日志級別從 1 到 20 , 1 是簡潔、 20 是詳盡。通常,內(nèi)存駐留日志不會發(fā)送到輸出日志,除非:
- 致命信號出現(xiàn),或者
- 源碼中的
assert被觸發(fā),或者 - 明確要求發(fā)送。
調(diào)試選項允許用單個數(shù)字同時設(shè)置日志級別和內(nèi)存級別,這會將二者設(shè)置為一樣的值。比如,如果你指定 debug ms = 5 , Ceph 會把日志級別和內(nèi)存級別都設(shè)置為 5 。也可以分別設(shè)置,第一個選項是日志級別、第二個是內(nèi)存級別,二者必須用斜線( / )分隔。假如你想把 ms 子系統(tǒng)的調(diào)試日志級別設(shè)為 1 、內(nèi)存級別設(shè)為 5 ,可以寫為 debug ms = 1/5 ,如下:
debug {subsystem} = {log-level}/{memory-level}
#for example
debug mds log = 1/20
Ceph 子系統(tǒng)及其默認(rèn)日志和內(nèi)存級別具體見 SUBSYSTEM, LOG AND DEBUG SETTINGS 。一旦你完成調(diào)試,應(yīng)該恢復(fù)默認(rèn)值,或一個適合平常運營的級別。
6.2 日志記錄選項
關(guān)于日志記錄選項的詳細(xì)信息,可以參考 Ceph 官方文檔的對應(yīng)內(nèi)容 LOGGING SETTING 。