最近使用swoole寫了websocket系統服務,出現cpu和記憶體持續增長的故障。
使用strace工具檢視系統棧呼叫情況:
strace -cp 程序
在syscall一欄發現socket建立過於頻繁,系統服務定義了乙個5秒的定時器進行輪詢redis佇列。而在這個定時器裡,每次執行都會new redis物件,頻繁建立socket連線是有開銷的,這也是出現cpu持續增長的原因。
解決方案有兩個:
使用連線池,連線池事先建立好一定數量的連線儲存在記憶體,當需要使用連線的時候從記憶體取出空閒的連線物件,這樣的好處是避免了頻繁建立socket連線的開銷,使資料連線得到重複利用。
使用長連線,使用static變數儲存連線物件,避免了每次定時器觸發的時候建立redis物件。
在當前場合,因為5秒輪詢一次,redis連線是長期占用,無疑使用獨佔連線更適合。所以選擇了方案二。
使用長連線後雖然cpu占用降低了,但觀察strace發現sendto函式呼叫非常頻繁超過了5秒執行一次的預期。
後查詢**找到了原因:定時器巢狀。**在work程序定義了每秒觸發的定時器去執行定時計畫,而redis輪詢服務是放在計畫任務裡又定義了5秒輪詢的服務,而最後執行的結果已經不是5秒觸發一次了。
使用strace追蹤多個程序
strace是 linux環境下的一款程式除錯工具,用來監察乙個應用程式所使用的系統呼叫及它所接收的系統資訊。追蹤程式執行時的整個生命週期,輸出每乙個系統呼叫的名字,引數,返回值和執行消耗的時間等。strace常用引數 p 跟蹤指定的程序 f 跟蹤由fork子程序系統呼叫 f 嘗試跟蹤vfork子程...
swoole使用協程
協程 協程可以理解為純使用者態的執行緒,其通過協作而不是搶占來進行切換。相對於程序或者執行緒,協程所有的操作都可以在使用者態完成,建立和切換的消耗更低。swoole可以為每乙個請求建立對應的協程,根據io的狀態來合理的排程協程,這會帶來了以下優勢 開發者可以無感知的用同步的 編寫方式達到非同步io的...
uClibc體驗 3 strace使用
2.cc mipsel linux gcc configure host mipsel linux 3.make 4.拷貝到小機,strace 出錯應用,毫無提示 5.strace 了一下hellqt,提示資訊很完整 6.鬱悶,開始逐個對比出錯和不出錯的應用,發現不出錯的都沒用多執行緒 7.這才想起...