記一次生產環境thrift服務的配置問題

2022-07-15 11:06:13 字數 1308 閱讀 5667

問題現象

有客戶反饋我們的產品有時反應很慢,處理會出現超時。

問題分析過程

1.第一反應可能是使用者增加,併發量太大了,詢問了運營,最近使用者註冊資料並沒有猛增。

2.分析access日誌,發現有隔一段時間會出現幾個連續的請求響應時長超過30秒,並且這些請求都是使用乙個thrift服務的,而連redis和其他thrift服務的請求沒有出現延遲的情況,問題出現在該thrift服務。

分析1)分析該thrift服務的日誌,發現介面出現超時的這段時間,該thrift沒有列印日誌,也就是沒有處理請求。這時懷疑是什麼資源用完了,首先想到的是資料庫連線池,該服務是 多資料來源的,並且每個資料庫連線池配置的都比較大,不可能出現連線池使用完的情況;也不可能出現乙個資料庫的連線用完,影響其他資料庫連線。

分析2)thrift客戶端配置的連線池使用完了?也不可能,前2天生產環境也把客戶端連線池配的比較大,按現在的使用者數來說夠用了。

分析3)自己寫工具抽取了access日誌中耗時超過20秒的所有請求,發現請求耗時多的請求都是成堆連續出現,並且第乙個請求都是請求報表介面,檢視thrift服務這些報表介面有些使用者資料很大,有的sql要30多秒。得出的結論是報表介面查詢阻塞了其它thrift介面,那原因又是什麼呢?跟技術總監聊了這個問題,他讓我們看一下thrift服務端處理請求的執行緒數。

分析4)檢視thrift服務端處理的**,org.apache.thrift.server.tthreadedselectorserver.args中預設配置的處理請求執行緒數是5,如果上面說的報表介面連續請求5次,就會出現報表請求阻塞其他請求的現象。在開發環境模擬重現了該問題。

/** the number of threads for selecting on already-accepted connections */

public int selectorthreads = 2;

/*** the size of the executor service (if none is specified) that will handle

* invocations. this may be set to 0, in which case invocations will be

* handled directly on the selector threads (as is in tnonblockingserver)

*/private int workerthreads = 5;

解決方案

1.調整框架,把工作執行緒抽取出來作為可配置引數,生產環境按需調整該引數。

2.把請求耗時的介面抽成乙個單獨的thrift服務,即使報表sql耗時,請求超時也不影響其他業務介面。

記一次生產報too man open files

有一天私有雲無法訪問,馬上聯絡廠商,最後廠商發現好多容器不停重啟,經過日誌檢視發現平台開啟檔案控制代碼太多,很奇怪,就開始排查,最後發現乙個埠,定位到應用spring actuator.這個應用是我為了監控微服務而發布的乙個監控應用,馬上看日誌,發現應用報錯,too many open files,...

記一次生產環境獲取不到redis連線問題排查

最近線上環境總是不穩定,用著用著就會出現獲取不到redis連線的情況,檢視redis伺服器端配置,發現連線數不是很多,那麼為什麼又會出現如此情況呢?首先檢視redis服務端的配置 通過redis cli連線到redis伺服器 redis cli h 127.0 0.1 p 6379 a 密碼 獲取客...

記一次生產故障,nginx503

問題概述 web頁面進行login操作,控制台報503 系統版本 centos 6.8 服務架構 前端兩個nginx 伺服器,可外網,中間兩台業務伺服器,使用docker起兩組服務 後端3臺redis 哨兵 和三颱mongo 問題分析 由控制台報503可知是伺服器內部原因,可能是網路或者服務方面。解...