開源項目brpc從入門到精通(二)

2020-11-24 架構師之家

本文是第一個開源項目研究系列,第一個開源項目選擇的是brpc,brpc是百度內最常使用的工業級RPC框架, 有1,000,000+個實例(不包含client)和上千種多種服務, 在百度內叫做"baidu-rpc". 目前只開源C++版本。

ps:為啥選擇brpc,因為算法想要真正在實際中運用,我們還是得要一個高性能實現,而brpc能幫助我們快速解決網絡交互問題,讓我們去實現算法邏輯。

在在線系統中,日誌是非常重要的功能,能幫助我們分析、定位問題,下面會介紹如果讓我們自己設計一個高性能的日誌系統,我們應該怎麼做。

日誌

日誌我們平時都用,如果自己來設計一個日誌框架,需要從哪些角度考慮呢?

我們先來考慮我們使用日誌的話,他應該有哪些最基本的功能?

場景:程序在運行過程中,首先發出要記錄的信息,然後通過約定格式化這些信息,最後再將其輸出到目的地,所以一個日誌框架需要有的基本功能有:

日誌記錄格式化輸出地日誌記錄我們可以看做是一個前端api,而輸出地則是後端,兩者之間經過一個格式化組件進行數據的規範、傳輸。另外在分布式系統中,日誌的輸出地只有一個,那就是本地磁碟。

在日誌框架的整體設計上,可以抽象為一個多生產者、單消費者的模型。前端通過api不斷寫入日誌,後端有一個消費者對日誌進行輸出,而目的就是本次磁碟。

如果輸出地是磁碟,那就必須要有日誌文件滾動功能,滾動的條件一般有兩個:

1. 日誌大小(每1G)

2. 時間(每隔1小時)

另外,如果我們要寫磁碟,那io就是關鍵,下面介紹下深入介紹下Linux 文件 io。

Linux 標準io

要想了解fwrite,最好的方式就是進行調試,下面是動手環節,大家可以按照下面的步驟,自己動手實驗的,便於理解,有任何問題都可以留言,儘量回答。

下面記錄下如何在開發機器上調試glibc代碼

因為在mac上開發,所以首先得有個Ubuntu鏡像。

1. docker run -it --name="gpp" ubuntu /bin/bash2. apt-get unpdate && apt-get install -y ubuntu-dev-tools vim3. docker commit gpp zhuanxuhit/ubuntu:v1

此處安裝 ubuntu-dev-tools 開發者工具。一勞永逸

參考文檔 跟我一起學Docker——搭建編譯環境篇

下一步是啟動了,啟動過程中,因為需要運行gdb,需要在啟動時加上--privileged=true參數,具體可以看:

dockercontainer下gdb無法正常工作的解決辦法

docker run --privileged=true -it -v ~/dev/share:/home/binss --name="gpp" ubuntu /bin/bash

下面是一段簡單的代碼:

gcc -g3 -O0 -gdwarf-4 -ggdb test.c -o test

運行出core,我們通過ulimit -c unlimited在當前文件夾下產生core文件,具體可以看 Linux 下如何產生core文件(core dump設置)

發現是沒有temp文件導致的,創建touch temp後繼續運行。

gdb a.out> l> b 5> r> s

出現錯誤

_IO_new_fopen (filename=0x5555555547e6 "./temp", mode=0x5555555547e4 "r") at iofopen.c:88 88 iofopen.c: No such file or directory.

這是需要我們去下載glibc源文件

root@28dcf784e1be:/home/binss# ldd a.outlinux-vdso.so.1 (0x00007ffd7b3c1000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f63d95b1000) /lib64/ld-linux-x86-64.so.2 (0x00007f63d9ba4000)

依賴的是 libc.so.6

直接查看 /lib/x86_64-linux-gnu/libc.so.6 root@28dcf784e1be:/home/binss# ll /lib/x86_64-linux-gnu/libc.so.6 lrwxrwxrwx 1 root root 12 Apr 16 20:14 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.27.so* 執行 libc-2.27.so

接著我們下載libc的原始碼,需要修改下source.list

具體的源可以查看:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/,注意打開deb-source,下載原始碼。

安裝完代碼後,我們就可以開始調試了。通過

(gdb) directory /home/binss/glibc-2.27/libio

設置好原始碼搜索目錄,下面開始調試。

通過gdb可以直接定位到fwrite的源碼,源碼如下,位於./libio/iofwrite.c。

設置gdb選項 set print pretty on

先到了iofwrite.c:31

下面我們看下gdb如任調試宏定義,怎麼在gdb中調試宏,可以參照https://sourceware.org/gdb/onlinedocs/gdb/Macros.html

gcc -g3 -O0 -gdwarf-2 test.c

上面我們怎麼知道gdb調試的時候會去加載glibc的debug版本呢?

通過設置 verbose on可以看到gdb會去自動加載符號進來。

最終 _IO_sputn 被化簡為:IO_validate_vtable(const struct _IO_jump_t)-> __xsputn(fp, buf, request) __xsputn 是 _IO_jump_t 中的指針

(gdb) s _IO_new_file_xsputn (f=0x555555756260, data=0x7fffffffe67b, n=12) at fileops.c:1220 1220 {

整個調用棧

將新申請到的內存設置到f->_IO_buf_base 中, 最終執行完後,fp中內存數據,我們將數據從用戶空間拷貝到了glibc分配的空間中。

上面我們可以看到,我們將數據是寫入到了glibc的緩衝區中,下面通過fflush,將其寫入到內核緩衝區中。調用函數fflush,gdb調試:

現在調用鏈到了系統調用了

系統調用部分,先上一張圖:

記得大學那塊,自己做嵌入式開發,就是看好多Linux驅動程序編寫。這塊有機會以後專門開個專題來介紹的。

現在總結下目前的進展,我們此次調試的目的是想看下fwrite是怎麼一步一步將數據寫入磁碟的,我們發現要想寫入磁碟,首先我們的數據會從用戶緩衝區中被拷貝到glibc的緩衝區,然後glibc再進行系統調用,將數據寫入到內核緩衝區,然後設備驅動程序再將數據從內核緩衝區寫到設備緩衝區,整個過程可以看下圖:

圖片來自文章:漫談linux文件IO,文中很好的闡述了整個io過程,推薦閱讀。

總結

本文介紹了程序中重要的日誌功能,為了能實現高性能日誌,我們去分析了底層寫入磁碟到底發生了什麼,發現其中一層層的數據拷貝,這些完全都是可以優化的,所以下一篇會去介紹目前高性能庫的做法,歡迎持續關注。

相關焦點

  • 搜狗開源srpc:自研高性能通用RPC框架
    今年7月底,搜狗公司開源了內部的工業級C++伺服器引擎Workflow,一路收穫業內許多認可和關注。9月15日,作為Workflow最重要的生態項目——srpc,一個基於其打造的輕量級RPC框架,也在GitHub上開源了。GitHub搜索「sogou srpc」即可找到該項目。
  • 百度開源2020年度報告:兩大開源平臺、九個捐贈項目
    導讀「從 2009年大規模定製 Hadoop到 2013年第一個前端可視化產品 ECharts率先開源,再到2016年和2017年分別正式對外開源飛槳(PaddlePaddle)、Apollo兩大平臺,截止目前,百度已在Github主導的18個開源組織累計開源項目1,023個、社區貢獻者20,000+、獲得Star總數210,000+。
  • 質粒構建:從入門到精通之高手進階
    輕鬆科研 | 趣讀文獻 | 前沿資訊 | 實用技巧在前兩期《質粒構建:從入門到精通之初窺門徑
  • 電腦主板維修,從入門到精通,這樣的教程你是否喜歡呢
    大家好,我是你們的蚯蚓叔叔,蚯蚓電腦,有很多粉絲朋友在後臺跟我留言:能否出一套電腦主板維修的相關教程,通過幾個月的慎重考慮,我決定從零基礎到入門再到精通,而且免費的奉獻給大家;那麼就從今天這篇文章開始:
  • 無人機相關英文縮寫大合集:從入門到假裝精通
    下面筆者梳理了一些無人機的相關縮寫與通俗解釋,從入門到假裝精通,算是拋磚引玉。  一、入門:  ①UAV:無人駕駛飛機(Unmanned Aerial Vehicle),簡稱無人機。  ②FPV:第一人稱主視角(First Person View),把無人機機載攝像頭的畫面實時傳輸回來。
  • 微積分從入門到精通的十道關卡之語言關(一)
    微積分從入門到精通的十道關卡之語言關(一)(一定先關注,再下單)第四關 懵逼的ε-δ,ε-X,M-δ,M-X系列語言(一)
  • 微積分從入門到精通的第六關——橫空出世的「非恆等變形」
    01微積分從入門到精通的十大關卡(六)—— 橫空出世的「非恆等變形」
  • 微積分從入門到精通第七關——中間變量是什麼「鬼」?
    01微積分從入門到精通的十道關卡(七)
  • 弱電電工基礎技術手冊,新手從入門到精通利器!
    弱電電工基礎技術手冊,新手從入門到精通利器!大家熟悉的電工,一般都是從事高壓強電方面的工作,但是弱電電工的概念人們並不是很清楚,弱電電工是指從事建築物內部以及內部和外部間的信息交換與信息傳遞工程安裝維修工作的電工。如今,信息化發展越來越好,弱電電工在建築領域中起到的作用也越來越大。很多朋友都想要從事或者轉行做弱電,那麼如何進行更好地學習呢?
  • 6月,機器學習最受歡迎的十大開源項目
    過去的一個月中,我們在將近250個機器學習開源項目中,綜合各種條件進行打分排序,最終評選出十大最新、最棒的機器學習開源項目。這份Top10名單包括NLP構架、圖像壓縮等項目。它們在GitHub上的平均標星數量是760多顆。希望你可以從中找到感興趣的項目。
  • 2018 年度 GtiHub 開源項目 TOP 25:數據科學 & 機器學習
    如果你是這一領域的初學者,可以先去看看 Faizan Shaikh 寫的 PyTorch 入門指南:https://www.analyticsvidhya.com/blog/2018/02/pytorch-tutorial/Papers with Code開源地址:https
  • 6月份Github上熱門的開源項目
    6月份GitHub上熱門的開源項目排行已經出爐啦,一起來看看上榜詳情吧!CPlusPlusThingshttps://github.com/Light-City/CPlusPlusThingsStar 5402這是一個適合初學者從入門到進階的倉庫,解決了面試者與學習者想要深入 C++及如何入坑 C++的問題。
  • Python爬蟲從入門到精通只需要三個月
    如何入門Python,為了能夠幫助大家更輕鬆的學好Python開發,Python爬數據,Python數據分析等相關理論知識,給大家共同分享自己一套Python學習生活資料,文章最後面的有附屬的相關資料,無論你是大牛還是小白,是想轉行還是想入行都可以來了解,一起不斷進步以及一起努力學習
  • 從安裝到做項目一步步教你ROS學習入門
    第一次接觸ROS是在瀋陽自動化所做項目的時候,那時候我才知道自己非常感興趣的機器人領域有一個叫做ROS(Robot Operating System)的平臺。仔細了解之後才知道ROS被機器人界看作是一套準標準平臺,很多人將其比作是手機界的安卓,電腦界的微軟。在我看來ROS最大的優點在於靈活、低耦合、分布式、開源以及功能強大而豐富的第三方功能包(類似於程式語言中的庫)。
  • 適用於數據項目的7種強大的開源工具 - CIO頻道 - 企業網D1Net...
    功能強大的數據項目開源工具將使企業的業務更加無縫和功能化。 無論是數據科學專業人士還是想要幫助企業成功地完成數據科學項目的IT部門,需要使用一些必不可少的數據科學工具。 以下是值得考慮的一些開源工具: 1.
  • 從論文到測試:Facebook Detectron開源項目初探
    從RCNN到更快RCNN,再到最近的FPN和獲得ICCV Best Paper的面具RCNN,深度學習在物體檢測中以絕對優勢從眾多機器學習算法中脫引而出。大家對Facebook的計算機視覺研究項目的開源期盼已久,經過1年多的漫長等待,今天Facebook終於開源了Detectron,Detectron開源項目使用caffe2和python接口。實現了10多篇計算機視覺最新的成果。下面我們簡單介紹一下Detectron所實現的論文。並且對Detectron進行初次測試,我們會在隨後的博客中更新我們自己測試得到的Detectron訓練模型和速度標準。
  • 2019版CAD軟體基礎教程+7G視頻教程,從入門到精通,3天學會繪圖
    2019版CAD軟體基礎教程+7G視頻教程,從入門到精通,3天學會繪圖本套課程有完善的課程體系,科學的教學方式,本套課程適合從基礎開始系統學習CAD的同學學習,也適合有一定基礎的同學學習提高,通過本課程的學習,可以明顯提高作圖水平,對於準備從CAD製圖、建築設計、機械製造等行業同學有非常大的幫助
  • ...入門講座第二課——實驗二:新建項目及LM Flash Programmer的使用
    歡 迎參加 Stellaris EK-LM4F120XL LaunchPad 入門講座的在線培訓。它基於 Eclipse 開源開發工具。 在為 Stellaris LM4F 編寫代碼之前,需要了解將要使用的工具。
  • 151頁電氣識圖實操手冊,入門到精通快速提升
    151頁電氣識圖實操手冊,入門到精通快速提升作為電氣施工人員,日常工作中,離不開電氣識圖,電氣識圖是電氣施工人員必須具備的最基礎的技能之一。但是電氣圖紙也是比較複雜的,對新手而言確實不容易搞懂,還有一些常用的術語、電氣符號,都跟電氣施工息息相關。
  • WAVE SUMMIT+2020:如何打造一個成功的AI開源項目?
    本次圓桌從三個主要問題出發,多維度剖析中國當下開源項目現狀,結合全球開源發展趨勢,探討 AI 開源項目的機遇與發展。 01 如何衡量開源項目是否成功?