亚洲一区二区超清美女视频-午夜精品久久久毛片蜜桃-免费观看视频一区二区三区-一区二区在线免费观看不卡

您好,歡迎進(jìn)入北京泰福特電子科技有限公司官網(wǎng)

咨詢服務(wù)熱線

400-015-1230

Linux下GDB調(diào)試NTP時(shí)間同步問(wèn)題

發(fā)布時(shí)間:2022-04-11 15:48:59

  最近有遇到一例比較有趣的Linux下NTP時(shí)間同步問(wèn)題,嘗試了使用GDB調(diào)試的方法解決,在這里分享一些個(gè)人的心得,希望對(duì)大家有些幫助。

問(wèn)題現(xiàn)象:

  ECS Linux CentOS實(shí)例中時(shí)間經(jīng)常出現(xiàn)偏差,客戶已經(jīng)根據(jù)官方文檔配置了NTP時(shí)間同步,同步源為文檔中指定的公網(wǎng)NTP服務(wù)器嘗試調(diào)整一些同步頻率的參數(shù),并沒(méi)有實(shí)際效果。其中注意到一個(gè)現(xiàn)象,如果我們列出NTP日志中信息,會(huì)發(fā)現(xiàn)一旦現(xiàn) "no servers reachable" 之后,ntpd就會(huì)停止同步。而如果重啟ntpd同步問(wèn)題就會(huì)暫時(shí)得到解決,過(guò)了一天左右問(wèn)題又會(huì)復(fù)現(xiàn)。

調(diào)試過(guò)程:

  由于通過(guò)普通的ntpd的調(diào)整一些參數(shù)無(wú)法解決問(wèn)題,決定采用GDB現(xiàn)場(chǎng)調(diào)試的方式來(lái)看看問(wèn)題發(fā)生時(shí)為什么ntpd不再同步。

  調(diào)試之前我們首先要確認(rèn)ntpd更新系統(tǒng)時(shí)間是具體在哪個(gè)函數(shù)中實(shí)現(xiàn)的。因此首先采用閱讀Linux NTP代碼的方式將范圍縮小,確認(rèn)具體代碼段如下:

void

clock_select(void)

{

...

clock_update(); <----------- 更新系統(tǒng)時(shí)間

因此我首先將斷點(diǎn)設(shè)在clock_select,結(jié)果是可以中到,得到的堆棧如下:

因此我進(jìn)一步可以設(shè)置斷點(diǎn)到clock_update附近:

設(shè)置斷點(diǎn)到clock_update但是這次沒(méi)有中,因此可以判定是在之前的邏輯判斷中跳出了。進(jìn)一步跟蹤后發(fā)現(xiàn):

for (n = 0; n < NTP_HASH_SIZE; n++) {

for (peer = peer_hash[n]; peer != NULL;peer =

peer->next) {

peer->flags &= ~FLAG_SYSPEER;

peer->status = CTL_PST_SEL_REJECT;

/*

* Leave the island immediately if the peer is

* unfit to synchronize.

*/

if (peer_unfit(peer))

continue;

  如上代碼我們對(duì)每一個(gè)時(shí)間同步源會(huì)調(diào)用peer_unfit來(lái)判斷他是否“適合”做時(shí)間同步。如果所有同步源都不適合做同步的話,自然就會(huì)跳出。因此接下去我們可以考慮設(shè)置斷點(diǎn)在peer_unfit,并且查看其返回值:

    注意上圖是在本地正常的測(cè)試機(jī)上截取的,而在用戶機(jī)器上返回值寄存器rax為1,因此可以判斷所有配置的同步源被peer_unfit中的邏輯判斷為不適合做同步。

因此我們接下去就可以使用相同的方法對(duì)peer_unfit做進(jìn)一步跟蹤:

我們發(fā)現(xiàn)失敗在如下的檢查:

if (root_distance(peer) >= sys_maxdist + clock_phi *

ULOGTOD(sys_poll))

rval |= TEST11;     /* distance exceeded */

匯編代碼如下:

匯編代碼

    這表明計(jì)算下來(lái)本地時(shí)鐘和遠(yuǎn)端NTP服務(wù)器的distance過(guò)大。clock_phi 是晶振的頻率為0.000015,而sys_poll是同步的詢問(wèn)時(shí)間,兩者相乘是非常小的。所以主要比較的是當(dāng)前的distance和sys_maxdist,后者默認(rèn)為1。

root_distance是一個(gè)相對(duì)復(fù)雜的計(jì)算:

dist += max(sys_mindisp, dist + peer->delay) / 2 +

peer->rootdispersion + peer->disp + clock_phi *

(current_time - peer->update) + peer->jitter;

其中可以發(fā)現(xiàn)他和當(dāng)前時(shí)鐘和NTP服務(wù)上次成功的時(shí)間,兩者的差值有關(guān)。因此如果時(shí)鐘走的比較快,而有一次甚至幾次同步失敗,整個(gè)NTP服務(wù)就有可能不會(huì)再進(jìn)行同步了。

尋找解決方案:

以上比較的幾個(gè)參數(shù)中唯一可調(diào)的就是sys_maxdist,我們可以繼續(xù)閱讀Linux代碼來(lái)了解怎么調(diào)整他:

case CONF_TOS_MAXDIST:

proto_config(PROTO_MAXDIST, 0, ftemp, NULL);

因此我們可以通過(guò)在ntp.conf中添加"tos maxdist"可以增大,從而容忍本地時(shí)鐘過(guò)快。

以上一例是采用GDB調(diào)試的方法來(lái)解決一些服務(wù)產(chǎn)生的問(wèn)題,希望給大家提供解決問(wèn)題的另一種思路。


  • 聯(lián)系方式
  • 傳 真:86-10-82782026
  • 電 話:400-015-1230
  • 地 址:北京市海淀區(qū)北清路68號(hào)院用友軟件園北區(qū)17號(hào)樓三層
在線咨詢

咨詢電話:

400-015-1230

  • 微信掃碼 關(guān)注我們

Copyright ? 2002-2035 北京泰福特電子科技有限公司 版權(quán)所有 備案號(hào):京ICP備12028220號(hào)-3
京公網(wǎng)安備 11010802025976號(hào)

掃一掃咨詢微信客服

18519396506
Powered by RRZCMS