本篇文章是個經驗談,作者想要聊聊是如何將一個 4vCPU 的VM給調整到可以達到每秒處理 1.2M(120萬)個 JSON Reuqest,本篇文章非常的長,所以會分多天來介紹。
整篇文章探討的是各種 turning 的步驟,來聊聊如何從最初每秒 224k(22萬四千) 給調整到每秒 1.2M 的處理能力。
整個過程分成九大步驟,後面同時標示每個過程後的每秒請求能力
1. Application Optimizations (347k)
2. Speculative Execution Migtigations (446k)
3. Syscall Auditing/Blocking (495k)
4. Disabling iptables/netfilter (603k)
5. Perfect Locality (834k)
6. Interrypt Optimizations (1.06M)
7. The Case of the Nosy Neighbor (1.12M)
8. The Battle Against the Spin Lock (1.15M)
9. This Gost to Twelv (1.20M)
作者強調,上述的過程不一定適合你的應用程式,但是透過這些步驟能夠讓你更佳瞭解應用程式的運作行為,同時也有機會發現一些潛在的瓶頸問題。
環境介紹
1. 團隊使用 Techempower 來進行 JSON Serialization 的測試
2. 使用 libreactor(event-driven框架) 來搭建一個簡單的 API Server
3. HTTP 的解析使用 picohttpparser,同時使用 libclo 來處理 JSON 的編碼
4. 硬體環境
- Server: 4 vCPU, c5n.xlarge AWS VM
- Client: 16 vCPU, c5n.4xlarge AWS VM (clinet太弱會變成瓶頸)
- Network: Server/Client 屬於同一個可用區域(AZ)
5. 軟體環境
- 作業系統: Amazon Linux2 (Kernel 4.14)
- Server: 使用 libreactor (使用不同版本,分別是 Round18 以及 Round20)
- Client: 修改 wrk 這個知名的工具並重新命名為 twrk,詳細差異自己看文章內部,主要都跟顯示有關
6. 實驗方式
- 每個測試跑三次,取中間值
- 256 連線,16 threads,同時每個 thread 都會 pin 到一個固定的 CPU
- 每個實驗都有兩秒的暖機時間來建立連線
Ground Zero
第一個要探討的就是什麼最佳化都還沒有使用前,到底當前應用程式可能的瓶頸在哪裏
首先團隊將該應用程式與其他常見的應用程式或是開發框架比較,譬如 Netty, Nginx, Actix, aspcore 等, libreactor 的效能不錯,有中上水準。
接者作者使用火焰圖(Flame Graphs)來 Profile 該伺服器,作者很好心地將文章中所有的火焰圖都調整了一下,讓所有的 user-space 相關的 function call 都轉成藍色,而剩下跟 kernel 相關都維持紅色。
1. 大部分的時間都在 Kernel 處理
2. 主要是花費在收封包與送封包
3. 應用程式本身主要是分兩大部分,解析 HTTP 的封包以及處理請求與回應。
從上述兩點來看,作者認為目前的應用程式寫得算不錯,因為瓶頸很明顯是卡在 Kernel 端
接下來就正式進入到各種 Turning 的章節探討
Application Optimizations
長話短說:
- 作者基於 libreactor Round18 的框架進行修改,並且所有的修改都已經被合併到 Round20 的版本中,而這些修改主要是實作方面的強化以及整個框架的最佳化。
1. 作者首先透過 htop 觀察運行過程,發現 Server 只有使用 2vCPU 而已(系統有 4vCPU),因此這是作者進行的第一個修改,讓 Server 使用了 4vCPU,這個簡單調整就讓效能提升 25%
註: 作者特別強調,不要覺得從 2vCPU 變成 4vCPU 效能就可以變成兩倍,主要是1) 沒有使用的 vCPU 還有很多其他的工作要處理,因此不是完全都送給你應用程式處理。2)基於 hypter-thread vCPU 的架構,環境只有兩個真正的 CPU 而是透過邏輯的方式產生四個抽象的 CPU,所以全用一定會變快,但是基於很多資源還是要競爭與共用,數字不是單純翻倍
2. 作者自己的應用程式本身使用 gcc 建置時有使用 "-o3" 的方式來最佳化處理,然而框架本身卻沒有使用 "-o3" 的方式來弄,因此作者也針對這個部分來處理,讓建制框架時能夠使用 -o3
3. 從實作方面來看,作者觀察到 libreactor 1.0 版本使用的是 read/write 這兩個常見的方式來處理封包的送收,作者將其修改成 recv/send 整個效能就提升了將近 10%。
註: write(針對 FD,更全面廣泛的用法) 與 send(針對 Socket,更針對的用法) 使用上差異不大,但是 write 於底層 Kernel 最終還是會呼叫到 send 來處理,所以基本上可以理解就是在沒有特別參數需求時,可以直接跳過幾個 kernel function 來達到加速的效果。
write kernel 內的走向: sys_write -> vfs_write -> __vfs_write -> sock_write_iter -> sock_sendmsg
send kernel 內的走向: sendto -> sock_sendmsg
4. 作者觀察到火焰圖中有一些 pthread 相關的資料,進而發現 libreactor 會創造一個 thread pool 來處理非同步的 DNS 名稱解析問題。對於一個 HTTP Client 來說,如果今天要發送請求到多個不同的 domain,而每個 domain 都會需要進行一個 blocking 的解析過程,透過這種方式可以減少 DNS 解析造成的 blocking 問題。然而對於 HTTP Server 來說,這個使用情境帶來的效益似乎就稍微低了些,畢竟 Server 只有 Bind Socket 之前可能會需要去解析一次 DNS 而已。
大部分的情境下, thread pool 都是應用程式初期會去創造而接者就不太會管她,但是對於錙銖必較的效能除錯人來說,任何能夠調整的部分都可能是個值得探討的地方。
作者透過修改 Server 端(準確來說是 libreactor 框架內的程式碼)關於 Thread Pool 的一些用法,成長的讓整個效能提升了 2~3%
結論來說,透過上述四個概念來提升的程式碼效能。
1. vCPU 盡量使用: 25%-27%
2. 使用 gcc -O3 來建置框架的程式碼: 5%-10%
3. 使用 march=native 等參數來建置最後的 server 應用程式: 5%-10%
4. 使用 send/recv 而非 write/read: 5%-10%
5. 修改 pthread 的用法: 2%-3%
註: 作者強調每個最佳化的結果並非是單純累積的概念,反而還會有互補的效果。
可能前述的操作實際上也會讓後續的操作達到更好的效果,
譬如如果先跑 vCPU 的調整,效能大概提升 25%,但是如果先執行別的最佳化過程,最後再來調整 vCPU,就可以達到 40% 的效果,主要是 CPU 可以共有效率的去執行程式。
最後,這個部分讓整個處理封包能力從 224k 提升了 55% 到 347k (req/s)。
從火焰圖來看,整個 user-space 的範圍縮小許多,同時 send/recv 的處理也有使得整體的高度下降一點點(大概四格..)
為了避免文章過長,本篇文章就探討第一個最佳化的過程,剩下的就敬請期待後續!
https://talawah.io/blog/extreme-http-performance-tuning-one-point-two-million/
同時也有2部Youtube影片,追蹤數超過4萬的網紅負能量宅肥窮魯蛇 Zackexplosion,也在其Youtube影片中提到,法規到底是做什麼用的?你又為什麼需要遵守法規呢? 法規規範了一些不可以做的事情 但同時執政者也利用法規做出許多不道德的事 在不妨礙他人自由與生命財產安全的前提之下 去思考法規的正當性是非常重要的 喜歡嗎?快來訂♂閱『負能量』的頻道吧! ► https://goo.gl/mJ2Ezn 訂♂...
「extreme 用法」的推薦目錄:
- 關於extreme 用法 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
- 關於extreme 用法 在 Yilianboy Facebook 的精選貼文
- 關於extreme 用法 在 Brett 林熙老師 Facebook 的最讚貼文
- 關於extreme 用法 在 負能量宅肥窮魯蛇 Zackexplosion Youtube 的最讚貼文
- 關於extreme 用法 在 TechaLook 中文台 Youtube 的最佳貼文
- 關於extreme 用法 在 Aggie 謝沛恩- 新用法~很耐掛...胸罩...喔 ... - Facebook 的評價
- 關於extreme 用法 在 【示範教學】更換CPU風扇散熱膏( Gelid GC-EXTREME ) 的評價
extreme 用法 在 Yilianboy Facebook 的精選貼文
.
幸福睡眠
Photo: Teddy Tzeng 曾崇倫
Model: @qqqa163076
Translation: @benkongenglish
.
偶爾聊天中聽朋友說失眠 惡夢
我感到心疼 卻也無能為力
畢竟誰不希望高枕無憂呢?
.
聽說睡眠是充電的途徑
也是大腦整理記憶和思緒的時刻
別讓生活的壓力 張狂的情緒侵佔重要的睡眠
運用冥想 透過轉念 看開世事
大腦清淨了 睡眠就容易了
.
工欲善其事 必先利其器
如果你無慮無念 只欠缺好枕的枕頭
好的枕頭能支撐頸部 穩定頭部
試試QTACE捕夢枕 @qtace.tw
讓QTACE捕夢枕給你一個美好的夜晚
.
MIT 60年羽毛工廠
日本溫泉御用羽毛枕
3種高度枕頭自由組合搭配
.
https://bit.ly/3qKuS9e
#qtace睡覺比賽 #sleeping
#熟睡的秘密 #溫泉捕夢枕 #6種高度8種用法
.
My heart aches upon hearing my friends talking about insomnia and having bad dreams but there’s nothing I can do.
Who doesn’t want to have some good sleep?
.
Sleeping is charging our brains.
The brain organises memories and emotions during sleep.
Meditate and look at things at different angles to avoid letting stress and extreme emotions invade the precious sleep time
Sleeping gets easier if the brain is free of stray thoughts.
.
Good tools are prerequisite to the success.
If you have your thoughts in check but just lack a good pillow,
Try QTACE Dreamcatcher @qtace.tw
QTACE Dreamcatcher is able to make your night a good one with support to the neck and stabilisation to your head.
.
MIT feather factory for 60 years.
Official feather pillow to Japanese hotspring
Mix and match combo with 3 different pillow heights
extreme 用法 在 Brett 林熙老師 Facebook 的最讚貼文
"want"常見的第二個用法,大家學起來吧!
下面這句的"want"是你們都知道的用法:「要」
He wants nothing. 他什麼都不要。
但是今晚SAT課講到"want"的第二個用法,小老外們都想不到:"want"也有"lack" 的意思「缺少、不足」。
當動詞(+for)、名詞(缺乏)、形容詞(不夠格)都有。
簡單說明一下。
動詞:
He wants for nothing. 他什麼都不缺。
He never wants for friends. 他從來不缺朋友。
名詞:
There's a serious want of teachers in rural school districts. 偏鄉地區的學校嚴重缺乏老師。
The man grew up in extreme want, so he understood poverty. 這男人在嚴重確乏的環境下長大,所以他知道什麼是貧困。
形容詞:
The actor's performance was found wanting. 這個演員的演技不足、不夠格。
We tried her cooking and found it to be very wanting. 我們試了她的廚藝,發現她的廚藝很不足、不夠格。
有興趣的同學也可以看看字典,很有意思的!
https://www.merriam-webster.com/dictionary/want
我最喜歡查字典、讀字典!😁
extreme 用法 在 負能量宅肥窮魯蛇 Zackexplosion Youtube 的最讚貼文
法規到底是做什麼用的?你又為什麼需要遵守法規呢?
法規規範了一些不可以做的事情
但同時執政者也利用法規做出許多不道德的事
在不妨礙他人自由與生命財產安全的前提之下
去思考法規的正當性是非常重要的
喜歡嗎?快來訂♂閱『負能量』的頻道吧!
► https://goo.gl/mJ2Ezn
訂♂閱耍廢實況頻道
►https://goo.gl/8oX5Rz
想要貼紙嗎?點這裡喔
►https://goo.gl/NoEsSL
DISCORD聊天群組
►https://discord.gg/62TBSdj
來FB按讚體驗負能量
► https://goo.gl/SmyDfH
IG廢圖區
►https://www.instagram.com/zackexplosion/
窮宅需要您的幫助,點下面可以陡內唷 QQ (平台名稱就是您的暱稱)
►https://goo.gl/Qe3ZgR
爆菊花同意書
► https://goo.gl/cPwBwE
請___簽署這份文件,因為您認為高速/快速公路太危險,而且在不合法的情況下騎上去就沒有素質。
倘若將來,高速公路開放紅黃牌摩托車行駛,與快速道路開放白牌摩托車行駛,本人___同意絕對不在上敘道路上使用摩托車(如:紅黃牌行駛高速公路,白牌行駛快速公路),若違反的話,願意上傳一支自爆菊花影片到社群網站上,表示個人素質與爆菊花決心。
__
近來有許多媒體盜錄影片,拿去當做新聞營利使用。要做新聞報導絕對沒問題,不用聯絡我,但,請寫清楚出處(內文包含影片原始連結或頻道連結),重新上傳之內容不要刻意蓋住片中浮水印即可,請盜錄者自重。
Cameras
► Garmin Virb XE, Samsung Gear 360 ( 2017 )
#負能量宅肥 #看廢文聽音樂 #還我高速公路 #三讀已過 #認同請分享 #機車黨 #吃機 #魯蛇 #肥宅 #宅肥 #負能量
extreme 用法 在 TechaLook 中文台 Youtube 的最佳貼文
電腦常常過熱嗎?有想過可能是因為你太久沒換CPU散熱膏了嗎?
從今天開始馬上加入TechaLook: http://goo.gl/Aw1Cok
♥TechaLook 示範安裝教學播放清單♥ ☛ https://www.youtube.com/playlist?list=PLo6IxJOSm7WiLgHhnAz8OoFoEMhLwJ_k-
☀加入 TechaLook 官網☀ http://www.techalook.com.tw
★加入 Techalook FB 粉絲團★ https://www.facebook.com/techalook.com.tw
所使用的示範設備為 :
散熱膏 : Gelid GC-EXTREME 3.5g包裝產品。
中央處理器 : Intel Celeron G1610 雙核心處理器。
主機板 : ASUS華碩 P8H77-I主機板。
想知道 Intel 英特爾 Celeron G1610 CPU 產品介紹,請上Tech a Look :
http://www.techalook.com.tw/【開箱】intel第三代-新賽揚celeron-g1610-雙核心處理器/
及 ASUS華碩 P8H77-I主機板 產品開箱,請上Tech a Look :
http://www.techalook.com.tw/【開箱】-華碩-asus-p8h77-i-主機板介紹/
如欲知更多 Gelid GC-EXTREME 散熱膏 產品資訊,請上 :
http://www.gelidsolutions.com/products/index.php?lid=1&cid=3&id=42&tab=1
最重要的是請持續鎖定 Tech a Look,有更多3C產品資訊以及精彩的示範教學內容等你喔~
Tech a Look 網址 : http://www.techalook.com.tw/
請大家到FB給我們按個讚!!!
Facebook : http://www.facebook.com/techalook.com.tw
還有訂閱我們的頻道!!!
YouTube : http://www.youtube.com/techalooktv
extreme 用法 在 【示範教學】更換CPU風扇散熱膏( Gelid GC-EXTREME ) 的推薦與評價
電腦常常過熱嗎?有想過可能是因為你太久沒換CPU散熱膏了嗎?從今天開始馬上加入TechaLook: http://goo.gl/Aw1Cok♥TechaLook 示範安裝教學播放清單♥ ... ... <看更多>
extreme 用法 在 Aggie 謝沛恩- 新用法~很耐掛...胸罩...喔 ... - Facebook 的推薦與評價
新用法~很耐掛...胸罩...喔~ #PulledAnAggie Level: Extreme 不斷的想說誰在我後面摸我屁股...原來是它 Good Morning. ... <看更多>