本篇文章是個經驗談,作者想要聊聊是如何將一個 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/
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「domain of function」的推薦目錄:
- 關於domain of function 在 矽谷牛的耕田筆記 Facebook 的最佳解答
- 關於domain of function 在 BorntoDev Facebook 的最佳解答
- 關於domain of function 在 台灣共識 台灣成真 Facebook 的最佳貼文
- 關於domain of function 在 コバにゃんチャンネル Youtube 的最讚貼文
- 關於domain of function 在 大象中醫 Youtube 的精選貼文
- 關於domain of function 在 大象中醫 Youtube 的精選貼文
- 關於domain of function 在 Keep your business logic clean with Domain Functions - GitHub 的評價
- 關於domain of function 在 Domain of function when open circles are included in graph 的評價
domain of function 在 BorntoDev Facebook 的最佳解答
🔥 การเขียนโค้ด
เหมือนการเรียนภาษาต่างประเทศจริงหรือ ?
.
กับสิ่งที่เกิดขึ้นกับสมองขณะเขียนโค้ด ที่ทุกคนอาจไม่เคยรู้ !
.
🚀 ตามปกติแล้ว คนส่วนใหญ่มักจะเปรียบการเขียนโค้ดเป็นการเรียนรู้ภาษาต่างประเทศภาษาใหม่ แต่ในมุมมองของสมองเองกลับไม่ได้เป็นอย่างนั้น !!!
.
🧠 นักประสาทวิทยาจาก MIT ได้ค้นพบว่าการทำงานของสมองในขณะที่เขียนโค้ดนั้น แตกต่างจากการประมวลผลทางภาษาหรือการทำโจทย์คณิตศาสตร์
.
โดยนักวิจัยได้ทำการสแกน fMRI (Function Magnetic Resonance Imaging) กับสมองของคนหนุ่มสาวที่มีเข้าร่วมชาเล้นจ์การเขียนโค้ดที่ใช้ทั้งภาษา Python และภาษา ScratchJr เพื่อดูว่าส่วนใดของสมองที่เกิดการเรืองแสงขึ้นกันแน่
.
👉 ซึ่งผลลัพธ์นั้นน่าสนใจมาก เพราะแทบไม่เห็นการตอบสนองใด ๆ ในส่วนประมวลผลภาษาของสมองเลย !
.
แต่ดูเหมือนว่าการเขียนโค้ดจะเป็นการเปิดใช้งาน “Multiple Demand Network” ในสมองของเรา โดยเครือข่ายส่วนนี้จะมีหน้าที่ในการ "ทำงานด้านความรู้ความเข้าใจที่ซับซ้อน เช่น การแก้ปัญหาทางคณิตศาสตร์ หรือ การแก้ปริศนาอักษรไขว้"
.
⭐ แต่ถึงจะบอกอย่างนั้น เมื่อมีการศึกษาโดยละเอียด ที่เปรียบเทียบสมองขณะเขียนโค้ดกับขณะแก้ปัญหาทางคณิตศาสตร์แล้ว กลับพบว่ารูปแบบการทำงานของสมองของทั้ง 2 กิจกรรมนั้นไม่ได้เหมือนกันไปซะหมด !
.
สำหรับการแก้โจทย์คณิตศาสตร์ เครือข่าย Multiple Demand จะแพร่กระจายไปทั่วกลีบสมองส่วนหน้าและส่วนข้าง โดยจะส่งผลกับสมองซีกซ้ายเป็นส่วนใหญ่
.
🏆 ในขณะที่การเขียนโค้ดนั้นจะทำให้เกิดการทำงานของเครือข่าย Multiple Demand ในสมองทั้งซีกซ้ายและซีกขวา (การเขียนโค้ดด้วยภาษา ScratchJr จะเกิดการทำงานของสมองซีกขวามากกว่าซีกซ้ายเล็กน้อย)
.
ซึ่งมาหักล้างแนวคิดที่ว่าการเขียนโค้ดจะทำให้เกิดการทำงานของสมองแบบเดียวกับการแก้โจทย์คณิตศาสตร์
.
✅ โดยสรุปแล้วก็คือ การเขียนโค้ดไม่เหมือนการเรียนรู้ภาษาต่างประเทศ แต่ก็ไม่ใช่การแก้โจทย์ปัญหาทางคณิตศาสตร์ซะทีเดียว ถึงจะมีบางส่วนที่คล้ายคลึงกัน แต่การเขียนโค้ดก็ยังเป็นทักษะที่มีเอกลักษณ์ในตัวของมัน และควรค่าแก่การเรียนรู้เพื่อพัฒนาสมองของเรานั่นเอง !!!
.
📌 อ้างอิงข้อมูลจาก “Comprehension of computer code relies primarily on domain-general executive brain regions“ ผ่าน www.biorxiv.org
.
โดย Anna A. Ivanova, Shashank Srikant , Yotaro Sueoka, Hope H. Kean, Riva Dhamala, Una-May O’Reilly, Marina U. Bers, Evelina Fedorenko
.
😎 ต้องการอ่านงานวิจัยเพิ่มเติม (.PDF) : https://www.biorxiv.org/content/10.1101/2020.04.16.045732v2.full.pdf
.
borntoDev - 🦖 สร้างการเรียนรู้ที่ดีสำหรับสายไอทีในทุกวัน
domain of function 在 台灣共識 台灣成真 Facebook 的最佳貼文
轉自"爆料革命""爆料秘密翻譯組" ~
2020/09/23 美國 FOX NEWS ( 福克斯新聞 ) 的熱門節目Lou Dobbs Tonight 主持人Lou Dobbs ( 魯.道布斯 ) 錄播採訪閰麗夢博士,詢問有關於中共武漢病毒 ( COVID-19 ) 真相的相關問題 ~
主持人Lou Dobbs ( 魯.道布斯 ) :
我們今晚的下一位嘉賓說,她有證據可以證明中共病毒 ( China Virus ),源於武漢的病毒實驗室,為了人身安全,她現在已經逃離了中共國,現在她在向人們講述病毒的起源,以及中共政權 ( CCP ) 是如何掩蓋 ( 病毒真相 ),現在有請病毒學專家"閰麗夢博士" !
她曾就職於香港大學公共衛生學院,晚上好,我很佩服您的勇氣,感謝妳敢說出妳掌握的情況,而且逃離中共國也需要很大的勇氣 !
那麼,首先讓我們談談,妳認為COVID-19病毒到底起源於哪裡 ? 而且妳認為COVID-19病毒是人工合成還是自然形成 ?
閰麗夢博士 :
謝謝你的邀請,是的,這個COVID-19 ( SARS Cov-2 ) 病毒是人工合成的,它的模版是來自於自然的蝙蝠病毒,這種蝙蝠病毒是中共軍方發現並擁有的,它們以 ZC45 和 ZXC21 命名 !
因此新冠病毒 ( COVID-19 、SARS CoV-2 ),是根據一種原本無害的蝙蝠病毒,經過人工修改,轉變成了強感染力、高致命性的病毒,而且新冠病毒 ( COVID-19 、SARS CoV-2 ) 偏好人類,它與人類的ACE2受體有很強的親和力 !
主持人Lou Dobbs ( 魯.道布斯 ) :
新冠病毒有如此不尋常的病毒序列,確切的說是病毒基因序列,妳能想到是否還有其他病毒,可以算是與其最接近的相似物,就細胞結構和基因序列而言 !
閰麗夢博士 :
事實上,這個新冠病毒 ( COVID-19 、SARS CoV-2 ),它們與非典病毒 ( SARS Virus ) 有一些相似的特徵,同時,它還與其他高製命性病毒,如依波拉 ( Ebola )或者其他高病原體,甚至是流感病毒有相似之處,就是因為這兩個功能部件使得新冠病毒 ( COVID-19 、SARS CoV-2 ) 如此致命,並且專攻人類 !
我們叫它 " RBD ",在論文中具體稱為 " 受體結合域 ( Reveptive Binding Domain ) ",和 " Furin 酶切位點 " ,這兩個特徵,是的,它們也可以在其他病毒種類中找到,但不是在這種冠狀病毒中可以找到的 !
它們 ( COVID-19 、SARS CoV-2 ) 被加以了非常精細的人工修改,我在論文報告中對此做了解釋,中共 ( CCP ) 企圖抹掉基因修改的痕跡,但最終他們還是留下了一些證據 !
新冠病毒 ( COVID-19 、SARS CoV-2 )的 ( 合成 ) 模式告訴我們是誰做的基因修改 !
主持人Lou Dobbs ( 魯.道布斯 ) :
在妳看來,是否有一絲希望,中共國政府、中共政府,會允許國際組織去調查、去看看真正的證據,那個實驗室到底發生了什麼 ? 以及這個病毒的起源 ?
閰麗夢博士 :
根據我的情報以及科學證據,並基於我的專業知識,以及我對於中共及其組織30多年的瞭解,因為我生在中共國,我想要告訴你想要找到解決方案,並知道到底發生了何事的唯一途徑,就是消滅這個政權,並進行研究、調查 !
所有的科學家,無論是中共科學家或是外國科學家,那些牽涉其中與中共政府勾結的 ( 科學家 ) ,( 調查 ) 他們所做的這些事,做的研究, ( 他們 ) 對真相的掩蓋,編造更多的謊言來欺騙世界 !
主持人Lou Dobbs ( 魯.道布斯 ) :
妳相信中共國是否有一個極為先進、精密的生物戰部隊 ? 是否還有其他病毒可供他們隨時使用 ?
閰麗夢博士 :
如果你是指是否還有其他類似病毒的話,我可以告訴您,病毒學家們在做實驗和相關項目的時候,從來不會只用一個病毒株 !
回到這個事件上,您可以看到中共國政府一直在推動科學家,鼓勵他們去研究各種不同的致命性病原體,在中共國全國搜索不同的動物源性病毒,類似舟山蝙蝠冠狀病毒 !
然後他們非常享受使用技巧,把材料 ( 病毒 ) 任意的挪放,就像推 " 樂高 ( LEGO ) " 一樣,來增強它 ( 病毒 ) 的功能,我們稱之為 " 功能性增強項目 (Gain of Function Project ) ",所以您不能相信他們只儲備了這麼一種特定的一個病毒株,他們 ( 中共 ) 總有很多的選擇,遠超你的想像 !
主持人Lou Dobbs ( 魯.道布斯 ) :
非常感謝博士,我們節目結束的時間快到了,感謝妳這非比尋常的故事,閰麗夢博士我們感謝妳 !
domain of function 在 コバにゃんチャンネル Youtube 的最讚貼文
domain of function 在 大象中醫 Youtube 的精選貼文
domain of function 在 大象中醫 Youtube 的精選貼文
domain of function 在 Domain of function when open circles are included in graph 的推薦與評價
To determine the domain, you need to figure out which values of x have corresponding values of y (that is, for which x is f(x) defined. ... <看更多>
domain of function 在 Keep your business logic clean with Domain Functions - GitHub 的推薦與評價
Domain Functions helps you decouple your business logic from your controllers, with first-class type inference from end to end. It does this by enforcing ... ... <看更多>