国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

記一次 Kubernetes 機器內(nèi)核問題排查

開發(fā) 前端
在線上環(huán)境中的某個應(yīng)用出現(xiàn)了接口緩慢的問題!就憑這個現(xiàn)象,能列出來的原因數(shù)不勝數(shù)。本篇博客主要敘述一下幾次排查以及最后如何確定原因的過程,可能不一定適用于其他集群,就當是提供一個參考吧。排查過程比較冗長,過去太久了,我也不太可能回憶出所有細節(jié),希望大家見諒。

此次排查發(fā)生在 2020-11 月份,一直沒時間寫博客描述事情經(jīng)過,本次正好一起寫了吧。

具體現(xiàn)象

在線上環(huán)境中的某個應(yīng)用出現(xiàn)了接口緩慢的問題!

就憑這個現(xiàn)象,能列出來的原因數(shù)不勝數(shù)。本篇博客主要敘述一下幾次排查以及最后如何確定原因的過程,可能不一定適用于其他集群,就當是提供一個參考吧。排查過程比較冗長,過去太久了,我也不太可能回憶出所有細節(jié),希望大家見諒。

網(wǎng)絡(luò)拓撲結(jié)構(gòu)

網(wǎng)絡(luò)請求流入集群時,對于我們集群的結(jié)構(gòu):

  1. 用戶請求=> Nginx => Ingress => uwsgi 

不要問為什么有了 Ingress 還有 Nginx,這是歷史原因,有些工作暫時需要由 Nginx 承擔。

初次定位

請求變慢一般馬上就會考慮,程序是不是變慢了,所以在發(fā)現(xiàn)問題后,首先在 uwsgi 中增加簡單的小接口,這個接口是處理快并且馬上返回數(shù)據(jù),然后定時請求該接口。在運行幾天之后,確認到該接口的訪問速度也很慢,排除程序中的問題,準備在鏈路中查找原因。

再次定位 – 簡單的全鏈路數(shù)據(jù)統(tǒng)計

由于我們的 Nginx 有 2 層,需要針對它們分別確認,看看究竟是哪一層慢了。請求量是比較大的,如果針對每個請求去查看,效率不高,而且有可能掩蓋真正原因,所以這個過程采用統(tǒng)計的方式。統(tǒng)計的方式是分別查看兩層 Nginx 的日志情況。由于我們已經(jīng)在 ELK 上接入了日志,ELK 中篩選數(shù)據(jù)的腳本簡單如下:

  1. "bool": { 
  2. "must": [ 
  3.   { 
  4.     "match_all": {} 
  5.   }, 
  6.   { 
  7.     "match_phrase": { 
  8.       "app_name": { 
  9.         "query""xxxx" 
  10.       } 
  11.     } 
  12.   }, 
  13.   { 
  14.     "match_phrase": { 
  15.       "path": { 
  16.         "query""/app/v1/user/ping" 
  17.       } 
  18.     } 
  19.   }, 
  20.   { 
  21.     "range": { 
  22.       "request_time": { 
  23.         "gte": 1, 
  24.         "lt": 10 
  25.       } 
  26.     } 
  27.   }, 
  28.   { 
  29.     "range": { 
  30.       "@timestamp": { 
  31.         "gt""2020-11-09 00:00:00"
  32.         "lte""2020-11-12 00:00:00"
  33.         "format""yyyy-MM-dd HH:mm:ss"
  34.         "time_zone""+08:00" 
  35.       } 
  36.     } 
  37.   } 
  38. }  

數(shù)據(jù)處理方案

根據(jù) trace_id 可以獲取到 Nignx 日志以及 Ingress 日志,通過 ELK 的 API 獲得。

 

  1. # 這個數(shù)據(jù)結(jié)構(gòu)用來記錄統(tǒng)計結(jié)果, 
  2. # [[0, 0.1], 3]表示落在 0~0.1 區(qū)間的有 3 條記錄 
  3. # 因為小數(shù)的比較和區(qū)間比較麻煩,所以采用整數(shù),這里的 0~35 其實是 0~3.5s 區(qū)間 
  4. # ingress_cal_map = [ 
  5. #     [[0, 0.1], 0], 
  6. #     [[0.1, 0.2], 0], 
  7. #     [[0.2, 0.3], 0], 
  8. #     [[0.3, 0.4], 0], 
  9. #     [[0.4, 0.5], 0], 
  10. #     [[0.5, 1], 0], 
  11. # ] 
  12. ingress_cal_map = [] 
  13. for x in range(0, 35, 1): 
  14. ingress_cal_map.append( 
  15.     [[x, (x+1)], 0] 
  16. nginx_cal_map = copy.deepcopy(ingress_cal_map) 
  17. nginx_ingress_gap = copy.deepcopy(ingress_cal_map) 
  18. ingress_upstream_gap = copy.deepcopy(ingress_cal_map) 
  19.  
  20.  
  21. def trace_statisics(): 
  22. trace_ids = [] 
  23. # 這里的 trace_id 是提前查找過,那些響應(yīng)時間比較久的請求所對應(yīng)的 trace_id 
  24. with open(trace_id_file) as f: 
  25.     data = f.readlines() 
  26.     for d in data: 
  27.         trace_ids.append(d.strip()) 
  28.  
  29. cnt = 0 
  30. for trace_id in trace_ids: 
  31.     try: 
  32.         access_data, ingress_data = get_igor_trace(trace_id) 
  33.     except TypeError as e: 
  34.         # 繼續(xù)嘗試一次 
  35.         try: 
  36.             access_data, ingress_data = get_igor_trace.force_refresh(trace_id) 
  37.         except TypeError as e: 
  38.             print("Can't process trace {}: {}".format(trace_id, e)) 
  39.             continue 
  40.     if access_data['path'] != "/app/v1/user/ping":  # 過濾臟數(shù)據(jù) 
  41.         continue 
  42.     if 'request_time' not in ingress_data: 
  43.         continue 
  44.  
  45.     def get_int_num(data):  # 數(shù)據(jù)統(tǒng)一做 *10 處理 
  46.         return int(float(data) * 10) 
  47.  
  48.     # 針對每個區(qū)間段進行數(shù)據(jù)統(tǒng)計,可能有點羅嗦和重復(fù),我當時做統(tǒng)計夠用了 
  49.     ingress_req_time = get_int_num(ingress_data['request_time']) 
  50.     ingress_upstream_time = get_int_num(ingress_data['upstream_response_time']) 
  51.     for cal in ingress_cal_map: 
  52.         if ingress_req_time >= cal[0][0] and ingress_req_time < cal[0][1]: 
  53.             cal[1] += 1 
  54.             break 
  55.  
  56.     nginx_req_time = get_int_num(access_data['request_time']) 
  57.     for cal in nginx_cal_map: 
  58.         if nginx_req_time >= cal[0][0] and nginx_req_time < cal[0][1]: 
  59.             cal[1] += 1 
  60.             break 
  61.  
  62.     gap = nginx_req_time - ingress_req_time 
  63.     for cal in nginx_ingress_gap: 
  64.         if gap >= cal[0][0] and gap <= cal[0][1]: 
  65.             cal[1] += 1 
  66.             break 
  67.  
  68.     gap = ingress_req_time - ingress_upstream_time 
  69.     for cal in ingress_upstream_gap: 
  70.         if gap >= cal[0][0] and gap <= cal[0][1]: 
  71.             cal[1] += 1 
  72.             break  

我分別針對 request_time(Nginx),request_time(Ingress)以及 requet_time(nginx) - request_time(Ingress)做了統(tǒng)計。

最后的統(tǒng)計結(jié)果大概如下:

 

 

結(jié)果分析

我們總共有約 3000 條數(shù)據(jù)!

圖一:超過半數(shù)的請求落在 1 ~ 1.1s 區(qū)間,1s ~ 2s 的請求比較均勻,之后越來越少了。

圖二:大約 1/4 的請求其實已經(jīng)在 0.1s 內(nèi)返回了,但是 1 ~ 1.1s 也有 1/4 的請求落上去了,隨后的結(jié)果與圖一類似。

從圖 1 圖 2 結(jié)合來看,部分請求在 Ingress 側(cè)處理的時間其實比較短的。

圖三:比較明顯了,2/3 的請求在響應(yīng)時間方面能夠保持一致,1/3 的請求會有 1s 左右的延遲。

小結(jié)

從統(tǒng)計結(jié)果來看,Nginx => Ingress 以及 Ingress => upstream,都存在不同程度的延遲,超過 1s 的應(yīng)用,大約有 2/3 的延遲來自 Ingress => upstream,1/3 的延遲來自 Nginx => Ingress。

再深入調(diào)查 - 抓包處理

抓包調(diào)查主要針對 Ingress => uwsgi,由于數(shù)據(jù)包延遲的情況只是偶發(fā)性現(xiàn)象,所以需要抓取所有的數(shù)據(jù)包再進行過濾……這是一條請求時間較長的數(shù)據(jù),本身這個接口返回應(yīng)該很快。

 

  1. "_source": { 
  2. "INDEX""51"
  3. "path""/app/v1/media/"
  4. "referer"""
  5. "user_agent""okhttp/4.8.1"
  6. "upstream_connect_time""1.288"
  7. "upstream_response_time""1.400"
  8. "TIMESTAMP""1605776490465"
  9. "request""POST /app/v1/media/ HTTP/1.0"
  10. "status""200"
  11. "proxy_upstream_name""default-prod-XXX-80"
  12. "response_size""68"
  13. "client_ip""XXXXX"
  14. "upstream_addr""172.32.18.194:6000"
  15. "request_size""1661"
  16. "@source""XXXX"
  17. "domain""XXX"
  18. "upstream_status""200"
  19. "@version""1"
  20. "request_time""1.403"
  21. "protocol""HTTP/1.0"
  22. "tags": ["_dateparsefailure"], 
  23. "@timestamp""2020-11-19T09:01:29.000Z"
  24. "request_method""POST"
  25. "trace_id""87bad3cf9d184df0:87bad3cf9d184df0:0:1" 
  26. }  

Ingress 側(cè)數(shù)據(jù)包

uwsgi 側(cè)數(shù)據(jù)包

數(shù)據(jù)包流轉(zhuǎn)情況

回顧一下 TCP 三次握手:

首先從 Ingress 側(cè)查看,連接在 21.585446 開始,22.588023 時,進行了數(shù)據(jù)包重新發(fā)送的操作。

從 Node 側(cè)查看,Node 在 Ingress 數(shù)據(jù)包發(fā)出后不久馬上就收到了 syn,也立刻進行了 syn 的返回,但是不知為何 1s 后才出現(xiàn)在 Ingress 處。

 

有一點比較令人在意,即便是數(shù)據(jù)包發(fā)生了重傳,但是也沒有出現(xiàn)丟包的問題,從兩臺機器數(shù)據(jù)包的流轉(zhuǎn)來看,此次請求中,大部分的時間是因為數(shù)據(jù)包的延遲到達造成的,重傳只是表面現(xiàn)象,真正的問題是發(fā)生了數(shù)據(jù)包的延遲。

不止是 ACK 數(shù)據(jù)包發(fā)生了延遲

從隨機抓包的情況來看,不止是 SYN ACK 發(fā)生了重傳:

有些 FIN ACK 也會,數(shù)據(jù)包的延遲是有概率的行為!

小結(jié)

單單看這個抓包可能只能確認是發(fā)生了丟包,但是如果結(jié)合 Ingress 與 Nginx 的日志請求來看,如果丟包發(fā)生在 TCP 連接階段,那么在 Ingress 中,我們就可以查看 upstream_connect_time 這個值來大致估計下超時情況。當時是這么整理的記錄:

我初步猜測這部分時間主要消耗在了 TCP 連接建立時,因為建立連接的操作在兩次 Nginx 轉(zhuǎn)發(fā)時都存在,而我們的鏈路全部使用了短連接,下一步我準備增加 $upstream_connect_time 變量,記錄建立連接花費的時間。http://nginx.org/en/docs/http/ ... .html

后續(xù)工作

既然可以了解到 TCP 連接的建立時間比較久,我們可以用它來作為一個衡量指標,我把 wrk 也修改了下,增加了對于連接時間的測量,具體的PR見這里,我們可以利用這一項指標衡量后端的服務(wù)情況。

尋找大佬,看看是否遇到類似問題

上面的工作前前后后我進行了幾次,也沒有什么頭緒,遂找到公司的其他 Kubernetes 大佬咨詢問題,大佬提供了一個思路:

宿主機延遲也高的話,那就暫時排除宿主機到容器這條路徑。我們這邊此前排查過一個延遲問題, 是由于 Kubernetes 的監(jiān)控工具定期 cat proc 系統(tǒng)下的 cgroup 統(tǒng)計信息, 但由于 Docker 頻繁銷毀重建以及內(nèi)核 cache 機制,使得每次 cat 時間很長占用內(nèi)核導(dǎo)致網(wǎng)絡(luò)延遲, 可否排查一下你們的宿主機是否有類似情形? 不一定是 cgroup,其他需要頻繁陷入到內(nèi)核的操作都可能導(dǎo)致延遲很高。

這個跟我們排查的 cgroup 太像了,宿主機上有一些周期性任務(wù),隨著執(zhí)行次數(shù)增多,占用的內(nèi)核資源越來越多,達到一定程度就影響了網(wǎng)絡(luò)延遲。

大佬們也提供了一個內(nèi)核檢查工具(可以追蹤和定位中斷或者軟中斷關(guān)閉的時間):https://github.com/bytedance/trace-irqoff

有問題的 Ingress 機器的 latency 特別多,好多都是這樣的報錯,其他機器沒有這個日志:

 

而后,我針對機器中的 kubelet 進行了一次追蹤,從火焰圖中可以確認,大量的時間耗費在了讀取內(nèi)核信息中。

其中具體的代碼如下:

小結(jié)

根據(jù)大佬所給的方向,基本能夠確定問題發(fā)生的真正原因:機器上定時任務(wù)的執(zhí)行過多,內(nèi)核緩存一直增加,導(dǎo)致內(nèi)核速度變慢了。它一變慢,引發(fā)了 TCP 握手時間變長,最后造成用戶體驗下降。既然發(fā)現(xiàn)了問題,解決方案也比較容易搜索到了,增加任務(wù),檢查內(nèi)核是否變慢,慢了的話就清理一次:

sync && echo 3 > /proc/sys/vm/drop_caches

總結(jié)

這次的排查過程是由于應(yīng)用層出現(xiàn)了影響用戶體驗的問題后,進一步延伸到了網(wǎng)絡(luò)層,其中經(jīng)歷了漫長的抓包過程,也增加了自己的腳本用于指標衡量,隨后又通過內(nèi)核工具定位到了具體應(yīng)用,最后再根據(jù)應(yīng)用的 pprof 工具制作出的火焰圖定位到了更加精確的異常位置,期間自己一個人沒法處理問題,遂請其他大佬來幫忙,大佬們見多識廣,可以給出一些可能性的猜想,還是很有幫助的。

當你發(fā)現(xiàn)某臺機器無論做什么都慢,而 CPU 和內(nèi)核卻不是瓶頸的時候,那有可能是內(nèi)核慢了。

希望本文能對大家未來排查集群問題時有所幫助。

責任編輯:未麗燕 來源: Dockone.io
相關(guān)推薦

2022-01-10 10:26:30

Kubernetes抓包環(huán)境

2023-04-06 07:53:56

Redis連接問題K8s

2021-05-13 08:51:20

GC問題排查

2021-11-11 16:14:04

Kubernetes

2021-11-23 21:21:07

線上排查服務(wù)

2022-02-08 17:17:27

內(nèi)存泄漏排查

2019-03-15 16:20:45

MySQL死鎖排查命令

2017-12-19 14:00:16

數(shù)據(jù)庫MySQL死鎖排查

2023-01-04 18:32:31

線上服務(wù)代碼

2024-04-10 08:48:31

MySQLSQL語句

2021-03-05 07:14:08

Linuxcrashvmcore

2021-05-26 11:06:06

Kubernetes網(wǎng)絡(luò)故障集群節(jié)點

2021-04-13 08:54:28

dubbo線程池事故排查

2022-11-03 16:10:29

groovyfullGC

2023-01-05 11:44:43

性能HTTPS

2022-11-16 08:00:00

雪花算法原理

2018-01-19 11:12:11

HTTP問題排查

2023-10-11 22:24:00

DubboRedis服務(wù)器

2020-11-16 07:19:17

線上函數(shù)性能

2011-08-12 09:30:02

MongoDB
點贊
收藏

51CTO技術(shù)棧公眾號

国产成人在线免费| 另类激情亚洲| 日韩精品一区二区在线观看| 少妇黄色一级片| 伊人青青综合网| 欧美xxxx做受欧美| 在线视频观看国产| 成人欧美一区二区三区白人| 欧洲美女和动交zoz0z| 91精品一区二区三区综合在线爱| 久久精品国产精品| 日韩影视在线| 欧美在线短视频| 国产二区三区四区| 91免费看`日韩一区二区| 精品国产一区二区三区麻豆免费观看完整版 | 一本大道综合伊人精品热热| 爱福利视频一区二区| 日本亚洲天堂网| 国产精品夜夜夜一区二区三区尤| 日韩成人午夜影院| 久久久国产欧美| 国产盗摄精品一区二区三区在线| 成人看片视频| 97精品国产一区二区三区 | 在线看日韩精品电影| xxx国产在线观看| 国产成人8x视频一区二区| 欧美性色黄大片人与善| 亚洲二区三区不卡| 51视频国产精品一区二区| 色8久久久久| 国产一区二区三区视频在线观看| a视频在线播放| 91精品国产综合久久精品app| 小小水蜜桃在线观看| 亚洲国产精品精华液网站| 一本色道无码道dvd在线观看| 国产传媒欧美日韩成人| 亚洲色婷婷久久精品av蜜桃| 日本在线不卡视频| 在线不卡日本| 极品少妇一区二区| 26uuu成人| 国产乱国产乱300精品| 特级黄色录像片| 国产一区二区中文字幕| 热久久最新网址| 成人av网站免费观看| 青青青青草视频| 久久久精品综合| 亚色视频在线观看| 亚洲第一激情av| 国产午夜视频在线观看| 91麻豆精品国产91久久久久久久久| 456国产精品| 国产资源一区| 亚洲人成网站影音先锋播放| 视频在线一区二区三区| 波多野结衣在线观看一区二区 | 日韩美女视频免费在线观看| 欧洲一区二区三区| 久热re这里精品视频在线6| 亚洲免费福利视频| 91精品免费观看| av大片在线| 亚洲精品久久久久久久久久久久久| 欧美精品videosex| 一区二区三区高清国产| 国产一区二区av在线| 欧美亚洲国产视频小说| 欧美精品1区| 亚洲欧美一区二区原创| 中文乱码字幕高清在线观看| 色天下一区二区三区| 91免费版黄色| 麻豆freexxxx性91精品| 男人日女人下面视频| 亚洲美腿欧美偷拍| 国产欧美黑人| 久久久成人精品视频| 一本久久青青| 日本一区二区三区视频在线观看| hitomi一区二区三区精品| 精东影业在线观看| 上原亚衣av一区二区三区| 亚洲第一狼人区| 亚洲曰韩产成在线| 日韩电影免费在线看| 91网页在线观看| 久久亚洲电影天堂| 国产女同互慰高潮91漫画| 全球av集中精品导航福利| 亚洲色图38p| 18一19gay欧美视频网站| 成人免费毛片app| 成人黄色一区二区| 精品国一区二区三区| 亚洲天堂中文字幕在线观看| 久久久极品av| 青青草成人在线观看| 91精品国产自产精品男人的天堂 | 欧美日韩在线播放| 综合中文字幕| 色噜噜狠狠一区二区| 91免费精品国偷自产在线| 国产精品嫩草影院久久久| 日韩精选视频| 成人免费在线观看入口| 国产精品美女久久久久久久久久久| 黄色av网站在线免费观看| 亚洲网站在线观看| 99久久夜色精品国产亚洲狼| 欧美日韩激情四射| 色综合天天视频在线观看| 欧美一区一区| 亚洲男人的天堂一区二区| 99国产精品视频免费观看一公开| 豆花视频一区二区| 在线观看一区二区三区三州| 日韩av不卡在线播放| 国产在线高清精品| 精品国产1区2区| 女人天堂在线| 久久精品国产亚洲| 亚洲综合丁香| 麻豆电影在线| 欧美国产亚洲视频| 精品无人区卡一卡二卡三乱码免费卡| 色婷婷综合缴情免费观看| 日韩中文字幕网址| 青椒成人免费视频| 欧美少妇另类| 国产成人精品优优av| wwwwxxxxx欧美| 成人国产二区| 性欧美大战久久久久久久免费观看 | 国产原创精品在线| 精品播放一区二区| 亚洲国产片色| 久青青在线观看视频国产| 欧美与欧洲交xxxx免费观看| 成人av电影在线观看| 大桥未久在线视频| 久久久久久九九九九| 在线观看日韩毛片| 亚洲精品一区二区在线看| 国产精品久久久久白浆| 国产91在线播放精品91| 国产精品美女久久久久av爽李琼| 视频欧美精品| 色一区在线观看| 超碰在线97免费| 一区二区三区不卡视频在线观看 | 亚洲福利电影网| 在线日韩影院| 日韩欧美不卡在线| 中文字幕成人在线观看| 51vv免费精品视频一区二区| 天堂8在线天堂资源bt| 亚洲天堂免费| 亚洲精品无码国产| 91精品视频在线| 色偷偷91综合久久噜噜| 欧美三级午夜理伦三级在线观看| 欧美爱爱视频免费看| 亚洲欧美一区二区三区久久| 精一区二区三区| 午夜日韩成人影院| 国产特级淫片高清视频| 久久亚洲国产精品| 国产精品丝袜91| 精品视频高潮| 嫩草影院2018| 91精品久久久久久久久久入口| 亚洲v中文字幕| 亚洲精品久久| 好了av在线| 在线无限看免费粉色视频| 亚洲美女中文字幕| 91免费看视频| 制服丝袜日韩| 精品视频一二三| 麻豆亚洲一区| 精品亚洲国产成av人片传媒| 中文字幕第88页| 亚洲一区二区视频在线观看| 91日韩在线| 亚洲电影视频在线| 国产爆乳无码一区二区麻豆| 欧美夫妻性视频| 亚洲午夜久久久久久久久电影院 | 色综合影院在线观看| 精品久久人人做人人爰| 久久99国内精品| 我要色综合中文字幕| 国产字幕中文| 欧美精品一区二区三区在线看午夜| 精品国产亚洲一区二区三区在线观看| 丁香网亚洲国际|