效能優化:弄懂goolg glog原理,提升程式效能
“ 當弄清一個庫的原理時,發現只需要一行環境變數,竟能讓程式提升20倍以上效能,瞬間解決應用層瓶頸。”
01
—
Google glog使用
Google glog是一個實現應用程式級日誌庫,該庫提供C++樣式stream的日誌記錄API,很多開源專案都在使用。如果你正在使用glog,或者打算使用,一定要注意一些事情。
具體使用方法可以參考幫助檔案,簡單使用如下:
int main() { FLAGS_log_dir = "./log/"; FLAGS_logbufsecs = 10; FLAGS_max_log_size = 256; // MB //FLAGS_minloglevel = 2; // GLOG_ERROR FLAGS_stop_logging_if_full_disk = true; //FLAGS_logbuflevel = 2; google::InitGoogleLogging("itest"); LOG(INFO) << "hello glog"; }
這裡強調說一下在glog的使用中,注意以下事項
1)設定minloglevel,哪些級別需要寫入日誌檔案(預設都寫日誌)
2)設定logbuflevel,哪些級別立即寫入檔案還是先快取(預設INFO級別以上都是直接落盤,會有io影響)
3)設定logbufsecs,最多延遲(buffer)多少秒寫入檔案,另外還有預設超過10^6 chars就寫入檔案。
4)使用VLOG,不僅方便除錯,也方便線上臨時排查檔案
5)使用LOG_EVERY_N,不用大量列印重複錯誤日誌。
設定變數也只需要一行,如export GLOG_logbuflevel=2。在這裡推薦一篇講glog程式碼的部落格地址(https://izualzhy.cn/glog-source-reading-notes-whole-process)。
注意事項1、2),寫日誌檔案會先加鎖,避免同時操縱同一檔案,然後會判斷是否需要fflush落盤,預設INFO級別以上需要直接落盤。列印了較多的WARNING日誌,會導致直接落盤,於是總是有磁碟io阻塞了請求。
02
—
弄清背後的原理
glog 僅支援同步日誌。它的寫入程式碼可以參考 LogMessage::Flush ,在寫入日誌的時候使用了互斥鎖,因此效能會受 I/O 速度影響。有兩個支援非同步日誌的非官方 glog 庫,他們分別是 g2log 和 g3log ,均採用 C++11 編寫。 boost::log 支援 同步和非同步 sink ,同步 sink 在將日誌傳遞給 backend 時會加
互斥鎖 。 boost::log 的同步非同步 sink 切換起來非常方便,只需要修改型別名就可以了。
弄清原理,就是考察對待問題的態度,往往未知的未知才是問題的關鍵。
始終對未知心敬畏才是對待未知正常的態度,更是本應有的覺悟。
效能問題可能來源於任何地方,包括系統中因你一無所知而不曾檢查的地方(為知的為知)。