1. 程式人生 > >每秒百萬級高效C++非同步日誌實踐

每秒百萬級高效C++非同步日誌實踐

非同步日誌與佇列實現的缺點

非同步日誌,按我的理解就是主執行緒的日誌列印介面僅負責生產日誌資料(作為日誌的生產者),而日誌的落地操作留給另一個後臺執行緒去完成(作為日誌的消費者),這是一個典型的生產-消費問題,如此一來會使得:

主執行緒呼叫日誌列印介面成為非阻塞操作,同步的磁碟IO從主執行緒中剝離出來,有助於提高效能

對於非同步日誌,我們很容易藉助佇列來一個實現方式:主執行緒寫日誌到佇列,佇列本身使用條件變數、或者管道、eventfd等通知機制,當有資料入佇列就通知消費者執行緒去消費日誌

但是,這樣的非同步佇列也有一定的問題:

  • 生產者執行緒產生N個日誌,對應後臺執行緒就會被通知N次,頻繁日誌寫入會造成一定效能開銷
  • 不同佇列實現方式也各有缺點: 
    • 用陣列實現:空間不足時,佇列記憶體不易拓展
    • 用連結串列實現:每條訊息的生產消費都對應記憶體的建立銷燬,有一定開銷

好了,可以開始正文了