本篇文章是個經驗談,作者想要聊聊是如何將一個 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/
「dns server軟體」的推薦目錄:
- 關於dns server軟體 在 矽谷牛的耕田筆記 Facebook 的最佳解答
- 關於dns server軟體 在 Taipei Ethereum Meetup Facebook 的最佳解答
- 關於dns server軟體 在 TibaMe-雲端網路系統工程師養成班 Facebook 的精選貼文
- 關於dns server軟體 在 【重灌狂人】 - Serva 多功能、免費架站軟體(支援HTTP, FTP ... 的評價
- 關於dns server軟體 在 dns server架設2023-精選在Instagram/IG照片/Dcard上的焦點 ... 的評價
- 關於dns server軟體 在 關於DNS Server 架設問題~ - Mobile01 的評價
dns server軟體 在 Taipei Ethereum Meetup Facebook 的最佳解答
📜 [專欄新文章] Private key security and protection / 私錀的安全與保護 — Tim Hsu
✍️ 洪偉捷
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Private key security and protection / 私錀的安全與保護 — Tim Hsu
Crosslink Taipei 在10/19、10/20 台北矽谷會議中心舉辦的 區塊鏈conf。 這是Crosslink Taipei 下午的演講,主講者是擔任CYBAVO CTO的徐千洋(Tim Hsu)先生,同時也是幣托、OTCBTC的資安顧問。
2018年一月被發現的硬體漏洞meldown跟spectr,我們的硬體為了要讓執行速度更快,processor會預先執行某些指令,也因此駭客可以透過這種方式,間接檢測出我們記憶體的內容,把敏感資訊都dump出來。雖然後這之後各CPU廠商都有推出針對這個bug的軟體update,但是在這之後硬體安全的問題逐漸浮出來面,也使世人意識到硬體資安的問題。而今天我們要談的部分不僅有軟體安全,也有硬體安全跟使用者資安觀念的問題。
淺談交易所與錢包
在從交易所提幣的時候,首先Server會先將這筆交易紀錄到交易所自己的資料庫內,之後再取得交易所金庫的private key去金庫取錢,再打到使用者的錢包內。在這個過程中,如果駭客可以竄改Server或資料庫的交易金額,原本要打給使用者1 BTC,變成10BTC,或是直接取得金庫的private key,對交易所都是一大噩夢
圖(一) 從交易所提幣的流程
攻擊手法
1. 交易所的網路架構
案例一: 交易所因為怕被偷交易資料與客戶資料,所以都把這些資訊先加密後再存到資料庫,但是這些資料仍然會被偷(交易所遭到電話詐騙),往後將這些資料加了三層密,仍無法防範資料被偷的情形,原因出在圖(二)的交易所網路架構。
圖(二) 交易所的網路架構(OA與資料庫間沒防火牆)
因為OA 與資料庫之間的網路沒有防火牆保護,所以駭客不用正面攻擊有防火牆的部分,而是攻擊OA的部分,再藉由OA連線到資料庫。一封藏有病毒的email求職信寄到HR的電腦,都有可能造成交易所資料外流。
解決方式: 就是在OA與資料庫間架個防火牆,如圖(三)所示。例如: 只有Engineer、RD 可以連線到資料庫,QA則只能連到測試環境,HR、CEO不需要、也不能連線到資料庫,依職責對連線範圍做縮限,則駭客可以攻擊的目標變少,我們也比較好做應對。講者重要的一句話: 「千萬不要輕忽駭客攻擊OA的能力」
圖(三) 好的交易所的網路架構
2. DNS Attack
透過汙染AWS 的DNS Server 將交易所網頁導向駭客的網頁,來騙取使用者個資。雖然在導向駭客頁面時,很容易發現駭客的網頁沒有使用安全憑證,或是安全憑證不是SSL核發,但使用者仍可能因資安觀念低落,而堅持連線到不安全的網站。
3. Online Paper Wallet
很多人因為覺得私鑰放電腦覺得不安全,又沒錢買硬體錢包,所以透過線上私鑰轉換器將私鑰轉換成QR code,然而再轉換時勢必要輸入自己的私鑰,容易使私鑰遭竊。
圖(四) 私鑰轉換詐騙網頁
4. 使用者對私鑰保護的意識很低
例如: 不了解私鑰的註記詞或其他相關資訊保密的重要性,而無意間通過社交軟體洩漏了這些重要資訊(硬體錢包開箱文 XD)。
5. 硬體錢包的漏洞
TREZOR 錢包是業內公認的研發最早最警慎最安全的加密儲存器,但是今年仍被發現硬體相關的漏洞。只要駭客輸入特定24碼pin碼,就可以通過硬體的側通道分析,輕易提取出未加密的私鑰,而且這個必須重新設計硬體架構才能夠防止這樣的攻擊。所以即便硬體錢包掉了,仍有被攻擊的疑慮,最好的解決辦法就是硬體錢包外再設定一個long Password,這樣就可以避免掉硬體錢包時帳戶虛擬貨幣遭竊
圖(五) 硬體錢包漏洞
題外話 — Iphone Jailbreak問題
今年在twitter,有人公布了最新攻擊iphone的方式,而問題出在手機晶片。Iphone開機時第一個執行的程序是 bootrom,而bootrom的程式碼則是位於記憶體唯獨區域,所以無法竄改。駭客可以利用bootrom上的bug來攻擊手機,而這些有問題的晶片出現在Iphone 6 ~ Iphone X。其實這攻擊方式充滿限制,不僅要取得欲攻擊的手機,而且這種攻擊方式每次重開機就會刷新。不過這也衍伸出新的問題,以後的iOS作業系統都更容易遭到入侵,因為我們可以在舊的手機上裝新的iOS系統,然後透過bootrom的漏洞來了解新的iOS系統的運作方式,因此這個問題應該被更加重視。
圖(六) axi0mX針對此bug的文章
保護方式
透過secure sharing將私鑰拆成User、Company、Vendor,分散私鑰存放風險
圖(七) 拆散私鑰,分散存放的風險
保護思維
未來除了在演算法的鑽研,也應該多多關注整個 區塊鏈產業的資安問題,從身分認證、系統安全、IT架構,都應該要從安全的角度來設計。
圖(八) 講者參考的設計架構
以上方的圖片為例,很多軟體架構在設計時都忽略了作業系統這一塊,而講者分享了他在設計時針對Server或資料庫的 OS做的處理,如下圖
圖(九) OS層級的安全防護
我們的app、網站、服務都跑在Sandbox層上,Sandbox可以限制由內到外的網路封包收送,同時在Sandbox之上還有Host-IDS(Host-based Intruction Detection System)會記錄及過濾程式在Sandbox跑的所有指令,而且有任何非法存取記憶體或網路封包的行為都會都過Host-IDS被記錄到Threat Intelligence,並且通知使用者。 我覺得這樣的好處是,使用者不僅可以在第一時間知道自己的帳號遭到駭客攻擊,也因為一切的動作都被Host-IDS過濾以及被記錄到Threat Intelligence,工程師也可以更快找到安全漏洞。
結語
近年來因網路的應用,資安越來越重要,除了軟體方面外,硬體方面也要兼顧安全,而使用者的觀念宣導更重要,否則不管我們的系統做的再怎麼嚴密,只要使用者意外連到駭客網站或是洩漏自己的私鑰,一切都是白談。演講中有一句話我覺得很值得借鏡,就是「我們一定要假設我們的系統會被駭客破解,而我們要做的就是盡可能減少被入侵後的損失」,上面提到的Host-IDS就是這樣的觀念,我們無法防止駭客進到Sandbox,但是可以記錄駭客的進到Sandbox後所有行為,這樣的架構才能在第一時間修正系統漏洞。
參考資料
Trezor錢包漏洞: https://bcsec.org/index/detail/id/585/tag/2
Iphone 漏洞: https://www.pcmarket.com.hk/2019/09/30/iphone-bootrom%E8%B6%8A%E7%8D%84%E5%B7%A5%E5%85%B7%E5%85%AC%E9%96%8B-4s%E8%87%B3x%E5%85%A8%E9%81%AD%E6%AE%83%E5%B9%B8%E5%8D%B1%E9%9A%AA%E6%80%A7%E4%BD%8E/
spectre&meldown介紹: https://www.youtube.com/watch?v=bs0xswK0eZk
Private key security and protection / 私錀的安全與保護 — Tim Hsu was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
dns server軟體 在 TibaMe-雲端網路系統工程師養成班 Facebook 的精選貼文
=== 84hrs Linux系統管理與網路服務 課程大綱 ===
== 第一階段 (Essential) : 30 hrs
= 上課環境規劃
= 本機安裝 OpenSuSE 及 部署 SLES
= Linux相關的發展歷史
= 使用 GNOME 桌面環境
= CLI 的使用
= 熟用共同性文書編輯器 VIM
= man 及 info
= 線上資源的 survey
= 檔案系統管理
= Shell Command 及 CLI 外部指令
= 使用YaST 管理系統
= 使用者, 群組帳戶的管理
= 系統套件及軟體管理
= 檔案系統權限及安全管理
== 第二階段 (Administration) : 42 hrs
= 系統開機流程分析及操作
= 系統程序及服務的管理
= 管理檔案系統 -- LVM, RAID, Quota
= 解析網路及 Routing 操作
= 硬體設備管理 及 驅動程式模組管理
= 遠端存取管理 -- SSH, VNC
= 監控系統 及 系統記錄的管理
= 系統工作排程
= 自動化異地備份策略及管理
= PAM 的管理
= 強化使用者環境
= 進階存取控制 (ACL)
= Packet-Filtering 防火牆 (SuSEfirewall2)
== 第三階段 (Network Services) : 12 hrs
= Network Printing --- CUPS
= DNS Server --- BIND
= DHCP Server
= FTP Server --- Pure-FTPD
= File and Print Service within MS. --- Samba.
= HTTP Server --- Apache2
= Mail Relay Server --- Postfix
= Recieving Mail System --- Cyrus-imapd
= Web-base Mail System --- OpenWebmail
dns server軟體 在 dns server架設2023-精選在Instagram/IG照片/Dcard上的焦點 ... 的推薦與評價
BIND(Berkeley Internet Name Domain)是全世界最廣泛用來提供DNS服務的軟體,能夠將網域名稱與IP相互對應,提供了「named」和能用來遠端管理named ... DNS ... ... <看更多>
dns server軟體 在 關於DNS Server 架設問題~ - Mobile01 的推薦與評價
網域註冊商那邊,網頁設定管理,有正確設定成「自管」嗎? ○ DNS server 是什麼種類的?(Windows/Linux/BSD) 什麼軟體(bind/named?) 正解檔內容 ... ... <看更多>
dns server軟體 在 【重灌狂人】 - Serva 多功能、免費架站軟體(支援HTTP, FTP ... 的推薦與評價
Serva 多功能、免費架站軟體(支援HTTP, FTP, DNS, SNTP, DHCP.. 伺服器) http://briian.com/?p=10756. ... <看更多>