1. 程式人生 > >效能優化:弄懂goolg glog原理,提升程式效能

效能優化:弄懂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 切換起來非常方便,只需要修改型別名就可以了。

弄清原理,就是考察對待問題的態度,往往未知的未知才是問題的關鍵。

始終對未知心敬畏才是對待未知正常的態度,更是本應有的覺悟。

效能問題可能來源於任何地方,包括系統中因你一無所知而不曾檢查的地方(為知的為知)。