原创 如何使用 perf 分析 splice 中 pipe 的容量變化

如何使用 perf 分析 splice 中 pipe 的容量變化 這個文章爲了填上一篇文章的坑的,跟蹤內核函數本來是準備使用 ebpf 的,但是涉及到了低內核版本,只能使用 kprobe 了。 恰好,在搜索東西的時候又看到了 perf,可以

原创 記一次 splice 導致 io.Copy 阻塞的排查過程

記一次 splice 導致 io.Copy 阻塞的排查過程 簡而言之,net.TCPConn 的 ReadFrom 零拷貝實現 splice 在 1.21.0 - 1.21.4 刪除了 SPLICE_F_NONBLOCK 參數,導致在 Ce

原创 使用 cmux smux 對 TCP 進行復用

使用 cmux/smux 對 TCP 進行復用 只寫一下如何使用,不對實現進行大量描述,兩個庫的代碼都比較精煉,花一會看一下就行。 cmux 對端口進行復用,單端口可以建立不同協議的連接(本質都是 TCP),如 TCP/TLS/HTTP/

原创 如何在 libevent 中讀取超過 4096 字節的數據

如何在 libevent 中讀取超過 4096 字節的數據 bufferevent 是 libevent 中相對高層的封裝,較 event 使用起來方便很多。 之前有一個需求,需要從服務端讀取數據進行操作,爲了防止數據過大,在 buffer

原创 如何基於 spdlog 在編譯期提供類 logrus 的日誌接口

如何基於 spdlog 在編譯期提供類 logrus 的日誌接口 實現見 Github,代碼簡單,只有一個頭文件。 前提 幾年前看到戈君在知乎上的一篇文章,關於打印日誌的一些經驗總結; 實踐下來很受用,在 golang 裏結構化日誌和 lo

原创 2023 的一些總結

2023 的一些總結 李宗盛在山丘開頭裏面寫道,"想說卻還沒說的 還很多 攢着是因爲想寫成歌"。 同樣的,在印象中在 2023 好像做了很多東西,接觸了很多技術,但是一直沒有整理,攢着攢着就到年底了。 細細思考了一下,有兩個板塊是今年主要發

原创 MIT6.828 Lab 1: C, Assembly, Tools, and Bootstrapping

前置準備 實現機器爲VMWare的虛擬機,操作系統爲 Debian-11(無桌面版本),內核版本爲 5.10.0,指令集爲 AMD64(i7 9700K),編譯器爲 GCC-10 QEMU 虛擬化支持 理論上只需要 qemu 提供軟件虛擬化

原创 重構代碼的一些想法

重構代碼的一些想法 最近需要新寫一個業務模塊,這個業務模塊和兩年前自己寫的一個業務功能高度類似,就想着能不能拿過來改改就行。這個業務模塊使用 golang 實現的,是我寫的第一個 golang 代碼。 以上爲背景,但是代碼拿過來後發現通用性

原创 STL漫遊之vector

std::vector 源碼分析 從源碼視角觀察 STL 設計,代碼實現爲 libstdc++(GCC 4.8.5). 由於只關注 vector 的實現,並且 vector 實現幾乎全部在頭文件中,可以用一個這樣的方法裏獲取比較清爽的源碼

原创 一次內核 crash 的排查記錄

一次內核 crash 的排查記錄 使用的發行版本是 CentOS,內核版本是 3.10.0,在正常運行的情況下內核發生了崩潰,還好有 vmcore 生成。 準備排查環境 crash 內核調試信息rpm,下載的兩個 rpm 版本必須和內核版