Elasticsearch寫入瓶頸導致skywalking大盤空白
前言
繼上次skywalking出故障《https://my.oschina.net/keking/blog/3016839》不到一個月,線上skywalking又出毛病瞭。又是大盤空白,trace列表最近的數據都查詢不出來,但是時間稍久的數據就能查詢出來,如一天前的數據有,一個小時前的數據就沒有,這個隻是表象,最終查明癥結是ES的服務寫入瓶頸,導致寫入寫入數據的線程阻塞導致的。下面是排錯過程以及解決方案說明。
問題定位
工具還是那個工具Arthas,不瞭解的可以翻閱我之前的博文,這裡不多說明Arthas。不過這次我們應用瞭一個新的進階指令thread,它可以查看當前線程信息,查看線程的堆棧。當skywalking大盤沒有數據時,使用如下指令:
thread -b
THREAD -B, 找出當前阻塞其他線程的線程
有時候我們發現應用卡住瞭, 通常是由於某個線程拿住瞭某個鎖, 並且其他線程都在等待這把鎖造成的。 為瞭排查這類問題, arthas提供瞭thread -b, 一鍵找出那個罪魁禍首。最後得到如下的結果:
如上圖,相信大傢已經看到問題所在瞭,重點在紅色字體箭頭指向的部分,不得不說Arthas做的太棒瞭。癥結就是ES的批量寫入失敗線程阻塞瞭。後從社區瞭解到是因為ES寫入瓶頸,導致skywalking在批量寫入索引的時候線程阻塞瞭。導致阻塞的那段時間的數據都沒有寫到ES,然後查詢是沒有問題的,表象就是skywalking的大盤空白也查詢不到近期的數據瞭。
解決方案
臨時方案,SKYWALKING參數調優
skywalking寫入ES的操作是使用瞭ES的批量寫入接口。我們可以調整這些批量的維度。盡量降低ES索引的寫入頻率,如:
elasticsearch: clusterNodes: 192.168.20.221:9200 indexShardsNumber: 2 indexReplicasNumber: 0 # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html bulkActions: 4000 # Execute the bulk every 2000 requests bulkSize: 40 # flush the bulk every 20mb flushInterval: 30 # flush the bulk every 10 seconds whatever the number of requests concurrentRequests: 2 # the number of concurrent requests receiver-register: default: receiver-trace: default: bufferPath: ../trace-buffer/ # Path to trace buffer files, suggest to use absolute path bufferOffsetMaxFileSize: 500 # Unit is MB bufferDataMaxFileSize: 1000 # Unit is MB bufferFileCleanWhenRestart: false
調整bulkActions默認2000次請求批量寫入一次改到4000次。批量刷新從20M一次到40M一次。這種配置調優確實生效瞭,重啟服務後兩三天瞭都沒有出現過ES寫入阻塞的問題。不過這種設置隻是暫時的,你隻能期望流量不突發,或者應用不增加。一旦遇到突發流量和應用的增加,ES寫入瓶頸還是會凸顯出來。而且參數設置過大帶來瞭一個新的問題,就是數據寫入延時會比較大,一次服務交互發生的trace隔好久才能在skywalking頁面上查詢到。所以最終解決方案是優化ES的寫入性能。
最終方案-優化ES的寫入性能
如果是自建Elasticsearch服務,在基礎大數據團隊負責搜索引擎 Elasticsearch 優化和開發,博文裡分享瞭很多可調優配置的參數。不過我們這邊綜合運維人力和支出方面的考慮,決定采用阿裡雲提供的Elasticsearch,不過這帶來瞭一個新的問題,阿裡雲的ES服務不論內外網都需要Http Basic認證,但是目前的skywalking並沒有提供這種支持。
結語
skywalking是一款非常不錯的開源apm產品,很多功能特性甚至可以和商業的apm產品一爭高下,比如trace查詢等功能。我們線上的skywalking沒有全面鋪開去接入應用,但是問題還是發生瞭不少,希望這些線上的踩坑排坑經驗能帶來更多的參考價值。關於Elasticsearch 帶Http Basic 認證skywalking不支持的問題,將在下文詳描述去解決
以上就是Elasticsearch寫入瓶頸導致skywalking大盤空白的詳細內容,更多關於Elasticsearch寫入skywalking空白的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- skywalking容器化部署docker鏡像構建k8s從測試到可用
- 解析Arthas協助排查線上skywalking不可用問題
- python實現skywalking的trace模塊過濾和報警(實例代碼)
- skywalking分佈式服務調用鏈路追蹤APM應用監控
- 基於docker部署skywalking實現全鏈路監控功能