Back to restaurants, back to real sophistication. RAW’s @raw_taipei current menu is great in many aspects— advanced details, intricate layers of flav...
Back to restaurants, back to real sophistication. RAW’s @raw_taipei current menu is great in many aspects— advanced details, intricate layers of flavors, excellent execution. It was enjoyable from start to finish.
The main course was this ANAORI Beef Rice, all the components of which were cooked by this luxurious carbon graphite pot, ANAORI kakugama @anaori_official . The pot is revolutionary in its design, style, function, and its price—the bigger size is asking for a whopping NT$129,900. For sure it will look super cool in your kitchen.
#食況轉播 #尊貴碳鍋與RAW午宴
今年初,我在Instagram上發現了一個謎般的鍋子,外方內圓,黝黑如炭,照片與影片精雕細琢,形象尊爵。攤開其廣宣名單,哎呀呀,不都是國際級大廚嗎!東京是奧田透,墨西哥是Enrique Olvera,利馬是Virgilio Martinez,義大利阿爾巴是Enrico Crippa。那麼,台北由江振誠 @andrechiang_sg 擔綱,順理成章。
三個神秘黑盒子從RAW的廚房乘著推車出場。江振誠主廚開宗明義:「這鍋子集壓力鍋、鑄鐵鍋、燜燒鍋於一身。」他分別示範了三種用法,第一煮是白米飯,似壓力鍋那般炊出完美晶彈的青森「青天霹靂米」;第二煮是牛菲力,如鑄鐵鍋那般燒出外焦香內瑰嫩的質地;第三煮是鴨肝與高麗菜鑲肉,仿燜燒鍋那樣火力穿透入裡,熟度均勻。
「而且很好看。」江振誠再加一點。
被江振誠說美的鍋子,是「#ANAORI kakugama碳鍋」,由日本的碳素專門製造商「ANAORI Carbon株式會社」成立的全新品牌,瞄準fine dining餐廳與高端家庭用戶。為什麼說高端呢?各位若上官網去查價錢,小尺寸要價NT$74,900,大尺寸要價NT$129,900。買鍋堪比名牌包。
奢侈品的價值未必以實用性來衡量,不過這鍋,確實有獨特的訴求。碳石墨一體成型,這咖鍋,導熱非常優異,畢竟,碳石墨的遠紅外線量是鑄鐵的五倍。日本的燒鳥、燒肉時常強調木炭,就是著眼於遠紅外線,也就不妨將此碳鍋想像為,食材被竹炭包圍著烹調。也因為厚,以及中央的釜型設計,於是也導熱均勻、蓄熱良好。適於直火加熱,烤、燉、煮、炸、蒸皆宜,上方的蓋子,翻過來還可做煎烤盤;中間一層檜木蓋,加熱後會散發優雅香氛。
繼續用原有的壓力鍋、鑄鐵鍋、燜燒鍋當然也可以,功能性與實用性則會限制常人對於鍋具的想像,吧。
別再讓大家誤會我在賣鍋子。託ANAORI之福,我也嚐到了RAW今年開賣以來備受好評的「Andre is back」菜單。
從頭到尾,毫無保留,沒有在手軟的。RAW哪一次不是這樣?而這次,我又明確感受到菜色之精之細,執行準確,那是對於「好吃」的深度理解,藉由一切細解綻放光芒。這的確延續Restaurant ANDRE的DNA,兼有RAW的活潑與動感;而RAW是一間量體比Restaurant ANDRE大得多的餐廳,卻仍能把一道道菜複雜的配件與元素精準呈現,值得喝采。
很喜歡開胃點心中,昆布脆片與熟成帆立貝清脆與軟黏的對比,海帶絲疊上柔韌,不同口感堆積起來的鮮味,閃現油封檸檬的高頻亮香;海膽花生醬天使麵,宛如麻醬拌麵的趣味,卻是甜鹹鮮的完美比例教人折服;尼斯沙拉,以煙燻和魚油貫穿全場,馬鈴薯以煙燻羅勒醬、第戎芥末醬做出差別,香檳醋漬珍珠洋蔥與橄欖油的清新酸脆也很重要。
玉米三重奏,一刀刀片下的玉米彷彿綢緞,果甜搭佐鮮辣(辣烏魚子面疙瘩),頓時味道立體;另以愛樂壓與雞湯萃取穀物、香料與咖啡粉的風味,平添表演性與趣味,加味的雞湯沖進玉米與香草製成的膠囊成為「玉米濃湯」,味道也很討喜。水針魚捲也有細工,捲進的是鱸魚肉與香草碎,蘸上南法燉菜「Barigoule」轉化而來的大蒜、雞湯、朝鮮薊醬汁,或者焦化味噌,都很鮮美可口,發芽小麥柔韌的顆粒感與鮮甜的味道,也加強土壤、種子的風味。
還有百吃不膩(也沒吃那麼多次啦)的「Memory 1997」— 江振誠主廚在法國「感官花園」餐廳創作的第一道菜,溫暖的鴨肝凍、柔美的黑松露醬汁,經典而舒心。
作為ANAORI午宴的主菜,那道釜飯也是非常美味的。飯真的好吃,來自青森的青天霹靂米被炊得飽滿Q彈、粒粒分明,和均勻五分熟的滑嫩牛菲力與水潤油香的鴨肝送作伙,既是解構版羅西尼牛排,也是升級版牛肉丼。
在隔板林立的RAW吃飯,是全新體驗。這是降級後我的第一場餐敘,也唯有回到餐廳,才能實際體會餐廳多麽不可取代。
execution用法 在 矽谷牛的耕田筆記 Facebook 的最佳解答
本篇文章是個經驗談,作者想要聊聊是如何將一個 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/