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

一次內核問題引起的 Kubernetes 節點故障解決紀實

開發 前端
在線上環境中的某個應用出現了接口緩慢的問題!!就憑這個現象, 能列出來的原因數不勝數. 本篇博客主要敘述一下幾次排查以及最后如何確定原因的過程, 可能不一定適用于其他集群, 就當是提供一個參考吧.

1 具體現象

在線上環境中的某個應用出現了接口緩慢的問題!!

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

2 網絡拓撲結構

網絡請求流入集群時, 對于我們集群的結構:

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

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

3 初次定位

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

4 再次定位 – 簡單的全鏈路數據統計

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

  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.     ] 
  39.   } 

數據處理方案

根據 trace_id 可以獲取到 Nignx 日志以及 Ingress 日志, 通過 elk 的 api 獲得.

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

我分別針對 request_time(nginx) , request_time(ingress) , 以及 requet_time(nginx) - request_time(ingress) ,做了統計.

最后的統計結果大概如下: 

Nginx響應時間

Ingress響應時間

Nginx-Ingress響應時間 

結果分析

我們總共有約 3000 條數據!

  • 圖一: 超過半數的請求落在 1 1.1s 區間, 1s 2s 的請求比較均勻, 之后越來越少了.
  • 圖二: 大約 1/4 的請求其實已經在 0.1s 內返回了, 但是 1~1.1s 也有 1/4 的請求落上去了, 隨后的結果與圖一類似.

從圖 1 圖 2 結合來看, 部分請求在 Ingress 側處理的時間其實比較短的,

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

總結

從統計結果來看, Nginx => Ingress 以及 Ingress => upstream, 都存在不同程度的延遲, 超過 1s 的應用, 大約有 2/3 的延遲來自 Ingress=>upstream, 1/3 的延遲來自 Nginx=>Ingress.

5 再深入調查 - 抓包處理

抓包調查主要針對 Ingress=>uwsgi , 由于數據包延遲的情況只是偶發性現象, 所以需要抓取所有的數據包再進行過濾… 這是一條請求時間較長的數據, 本身這個接口返回應該很快.

  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側數據包

uwsgi側數據包

數據包流轉情況

回顧一下TCP三次握手:

首先從Ingress側查看, 連接在21.585446開始, 22.588023時, 進行了數據包重新發送的操作。

從Node側查看, node在ingress數據包發出后不久馬上就收到了syn, 也立刻進行了syn的返回, 但是不知為何1s后才出現在ingress處。 

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

不止是ack數據包發生了延遲

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

有些 FIN ACK 也會, 數據包的延遲是有概率的行為!!!

總結

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

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

后續工作

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

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

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

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

這個跟我們排查的 cgroup 太像了,宿主機上有一些周期性任務,隨著執行次數增多,占用的內核資源越來越多,達到一定程度就影響了網絡延遲

大佬們也提供了一個內核檢查工具(可以追蹤和定位中斷或者軟中斷關閉的時間):

https://github.com/bytedance/trace-irqoff

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

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

其中具體的代碼如下:

總結

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

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

7 總結

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

當你發現某臺機器無論做什么都慢, 而cpu和內核卻不是瓶頸的時候, 那有可能是內核慢了.

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

本文轉載自:「k8s技術圈」,原文:https://tinyurl.com/y5wx3m5x,版權歸原作者所有。

 

責任編輯:未麗燕 來源: Docker中文社區
相關推薦

2021-03-29 12:35:04

Kubernetes環境TCP

2024-03-18 09:10:00

死鎖日志binlog

2021-12-02 07:50:30

NFS故障內存

2022-11-03 16:10:29

groovyfullGC

2011-05-06 10:32:06

硬盤鍵盤

2020-08-19 11:02:39

系統ssh登錄

2021-05-26 11:06:06

Kubernetes網絡故障集群節點

2018-05-30 11:09:41

memcache服務器故障

2021-11-02 09:55:57

Linux內核內存

2018-12-07 11:12:16

Linux運維內核

2021-11-11 16:14:04

Kubernetes

2010-07-30 16:10:45

UPS設備燒毀故障分析

2021-12-12 18:12:13

Hbase線上問題

2019-12-27 10:43:48

磁盤數據庫死鎖

2019-11-04 10:37:53

MongoDB宕機日志

2019-04-18 10:55:00

故障演練流量

2020-09-16 08:26:18

圖像定位尺寸

2021-02-11 14:06:38

Linux內核內存

2021-01-08 13:52:15

Consul微服務服務注冊中心

2016-11-16 09:25:15

WindowsWindow 8Windows 10
點贊
收藏

51CTO技術棧公眾號

国产精品狼人久久影院观看方式| 亚洲欧美综合另类在线卡通| 久久久久这里只有精品| 黄网站app在线观看大全免费视频| 牛夜精品久久久久久久99黑人| 日韩一区视频在线| av激情在线| 波多结衣在线观看| 国产九九精品| 国产精品一区二区久久久久| 亚洲an天堂an在线观看| 日韩中文字幕不卡| 国产在线视频一区| 一区二区三区四区视频免费观看| 成a人片国产精品| 欧美午夜寂寞影院| 夜鲁夜鲁夜鲁视频在线播放| 99精品国产一区二区三区不卡| 免费在线观看亚洲视频| 久热国产在线| 国产美女一区视频| 欧美日韩伦理| 亚洲一区二区福利| 午夜伦理在线| 国产精品电影在线观看| 成全视频全集| 精品视频日韩| 欧美激情视频网| 中文.日本.精品| 亚洲福利视频专区| 亚洲精品白浆| 欧美一区二区网站| 国产超级va在线视频| 欧美日韩在线播放三区| 天堂网www中文在线| 亚洲午夜三级在线| 超碰在线电影| 韩日在线一区| 亚洲а∨天堂久久精品喷水| 中文字幕在线播放| 欧美曰成人黄网| 国内av一区二区三区| 黑人与娇小精品av专区| 在线视频色在线| 精品国产乱码久久久久久婷婷 | 亚洲日本一区二区三区| 日韩有码免费视频| 国产拍欧美日韩视频二区| 成年人视频在线免费| 国产校园另类小说区| 91黑丝在线| 欧美日韩亚洲视频| 97视频在线观看网站| 欧美日韩国产综合一区二区| 欧美午夜电影一区二区三区| 精品久久久久香蕉网| 成人一对一视频| 99精品欧美一区二区三区小说| 妞干网在线视频观看| 久久毛片高清国产| 97影院理论午夜| 午夜久久久久久久久| 成人77777| 亚洲精品国精品久久99热 | 91露出在线| 7777精品伊人久久久大香线蕉 | 国产精品高潮呻吟视频| 婷婷丁香综合| 色婷婷综合久久久久中文字幕1| 成人福利网站| 男同互操gay射视频在线看| ww亚洲ww在线观看国产| 亚洲国产精品嫩草影院久久av| 国产精品∨欧美精品v日韩精品| 台湾亚洲精品一区二区tv| 欧美激情亚洲精品| 亚洲欧美日本日韩| 亚洲精品88| 嫩草在线视频| 精品久久久久久亚洲综合网| 超碰97在线免费| 欧美精品在线免费播放| 福利片在线一区二区| 1769免费视频在线观看| 99re国产视频| 欧美mv日韩mv国产网站| 西野翔中文久久精品字幕| 亚洲第一导航| 欧洲日韩一区二区三区| 日本免费成人| 成人黄色中文字幕| 欧美一区二区三区成人久久片| 成人亚洲综合| 国产91精品久久久久| 久久精品人人做人人爽人人| 伊人久久青青草| 日韩精品在线第一页| 成人女性视频| 欧美爱爱视频网站| 午夜视频在线观看一区| 久草在线资源站手机版| 97成人在线视频| 国产视频一区二区在线| 外国成人直播| 日韩欧美一区二区在线观看 | 亚洲激情偷拍| 一本色道久久88亚洲精品综合| 欧美mv和日韩mv的网站| 99久久久国产精品免费调教网站| 久久免费国产视频| 91社区在线播放| 中文字幕 在线观看| 蜜桃视频成人在线观看| 97成人精品视频在线观看| 国色天香久久精品国产一区| 欧美激情综合在线| 黄色网在线免费看| 欧洲亚洲免费在线| 成人av电影在线| 18videosex性欧美麻豆| 国产成人精彩在线视频九色| 狠狠色丁香九九婷婷综合五月| 色影视在线视频资源站| 久久精品国产免费观看| 视频在线观看一区二区三区| 二区中文字幕| 久久国产精品视频| 国产精品影视在线观看| 超碰在线无需免费| 3d动漫精品啪啪一区二区三区免费| 中文av一区二区| 韩国精品视频在线观看| 国产欧美综合一区| 欧美不卡一二三| 亚洲欧洲一级| 国产小视频在线播放| 国产精品久久久久久久久影视 | 精品国产av无码一区二区三区| 欧美伊人精品成人久久综合97| 蜜臀久久99精品久久一区二区| 中国丰满人妻videoshd| 国产一区二区日韩| 精品无码三级在线观看视频| a级影片在线| 国产精品一区二区三区在线| 精品国产999| 亚洲澳门在线| 免费黄色在线视频网站| 日本久久久久久| 欧美国产成人精品| 66精品视频在线观看| 男人天堂手机在线视频| 亚洲国产精品久久| 毛片基地黄久久久久久天堂| 黄网站在线观| 一区二区三区免费看| 欧美一级二级三级乱码| 国产精品主播| 国产精品探花在线| 欧美午夜在线视频| 欧洲成人av| 狠狠色一日本高清视频| а√在线中文在线新版| 欧美一区二区在线| 欧美一区二区日韩| 另类小说视频一区二区| 蜜桃传媒在线观看免费进入 | 欧美另类极品videosbestfree| 国产一区二区三区在线观看精品 | 亚洲三级在线看| 色综合www| 色视频网站在线观看| 国产成人精品综合久久久| 五月综合激情婷婷六月色窝| 久久看人人摘| 国产精品久久一区二区三区不卡| 国产亚洲一区二区三区在线播放| 欧美人妇做爰xxxⅹ性高电影| 亚洲影院免费| www.九色在线| 黄色一级一级片| 国产精品久久久久高潮| 91国内精品野花午夜精品| 久久婷婷丁香| 欧美成人福利| 浪潮av在线| 91精品国产99久久久久久红楼| 欧美亚洲高清一区| av在线播放资源| 日韩成人dvd| 国产精品网友自拍| 欧美福利视频在线| 日韩一区在线播放| 午夜精品免费| 欧美aa在线观看| 欧美黑人又粗又大又爽免费| 国产成人精品电影久久久| 欧美日韩国产高清一区二区三区 | 影音欧美亚洲| xxxxxxxxx欧美|