雖然這篇Locality development鄉民發文沒有被收入到精華區:在Locality development這個話題中,我們另外找到其它相關的精選爆讚文章
在 locality產品中有42篇Facebook貼文,粉絲數超過2,850的網紅矽谷牛的耕田筆記,也在其Facebook貼文中提到, 本文延續前篇效能校正的經驗談,上篇文章探討了關於Locality與中斷中可以最佳化的部分,。本篇文章將繼續剩下最佳化步驟的探討。 The Case of the Nosy Neighbor 從前述最後的火焰圖中,作者觀察到幾個跟網路有關的 kernel call,譬如 dev_queue_xmit...
同時也有4部Youtube影片,追蹤數超過15萬的網紅ロイドごはん,也在其Youtube影片中提到,今夜は広島グルメの代名詞とも言える広島お好み焼き!広島県広島市にある『へんくつや薬研堀店』にお邪魔しました!広島市最大の繁華街である流川には広島名物のお好み焼きが食べられるお店が数多くあります。『へんくつや』は、みっちゃん、ふみちゃん、八昌、越田…などグルメ本に紹介される有名店のひとつでもあり、元祖...
「locality」的推薦目錄
- 關於locality 在 Lyn Kong Instagram 的精選貼文
- 關於locality 在 Eat n Hop Sabah 吃乐在沙巴 Instagram 的最佳解答
- 關於locality 在 Khairunnisa’ Jamal Instagram 的最讚貼文
- 關於locality 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
- 關於locality 在 矽谷牛的耕田筆記 Facebook 的最佳解答
- 關於locality 在 矽谷牛的耕田筆記 Facebook 的最讚貼文
- 關於locality 在 ロイドごはん Youtube 的最佳解答
- 關於locality 在 NDVC - Railway and Airline Youtube 的最佳貼文
- 關於locality 在 Smart Travel Youtube 的最讚貼文
locality 在 Lyn Kong Instagram 的精選貼文
2021-05-16 19:24:02
🥦 🥦 Broccoli Trees @ Giam Kanching. . You can only find it at the Rawang Bypass. The local name Kanching was named after its type locality of Kanching...
locality 在 Eat n Hop Sabah 吃乐在沙巴 Instagram 的最佳解答
2021-05-10 02:04:04
Wow look at this 𝐒𝐚𝐛𝐚𝐡 𝐥𝐨𝐜𝐚𝐥 𝐨𝐰𝐧 𝐒𝐚𝐛𝐚𝐬𝐜𝐨 𝐜𝐡𝐢𝐥𝐥𝐢 𝐬𝐚𝐮𝐜𝐞 in “Original” and “Sweet & Spicy” for everyday’s dining...are you ready to “𝐅𝐞𝐞𝐥 𝐭𝐡𝐞 𝐇𝐞𝐚𝐭” now? ...
locality 在 Khairunnisa’ Jamal Instagram 的最讚貼文
2021-04-23 09:33:42
10weeks of discourse with this amazing little reading group was such a fruiful journey in my intellectualism world - Alternative discourse was writte...
-
locality 在 ロイドごはん Youtube 的最佳解答
2019-12-02 19:00:06今夜は広島グルメの代名詞とも言える広島お好み焼き!広島県広島市にある『へんくつや薬研堀店』にお邪魔しました!広島市最大の繁華街である流川には広島名物のお好み焼きが食べられるお店が数多くあります。『へんくつや』は、みっちゃん、ふみちゃん、八昌、越田…などグルメ本に紹介される有名店のひとつでもあり、元祖のお店はお好み村やドンキホーテなどが並ぶショッピング街、新天地にあります。市内にいくつか支店もありますが、こちら薬研堀店は場所柄もあり夜中までたくさんの地元の方や常連の方が立ち寄る地域密着のお店でした!まずはハイボールで乾杯し、とんぺい焼きと肉玉チーズを注文しました!熱々の鉄板からコテで頂くお好み焼き…これからの季節はたまらないですね!それではその職人技から実食までを一気にご覧下さい!
Tonight, Hiroshima okonomiyaki is a synonym for Hiroshima gourmet! We visited "Henkutsuya Yakukenbori" in Hiroshima City, Hiroshima Prefecture! In Nagarekawa, the largest downtown area in Hiroshima City, there are many shops where you can eat Hiroshima's specialty okonomiyaki. "Henkutsuya" is one of the famous shops introduced in gourmet books such as Micchan, Fumi-chan, Hassho, Koshida, etc. The original shop is located in Shintenchi, a shopping street lined with Okonomiyamura and Don Quixote. There are several branches in the city, but this Yakkenbori store has a locality and was a community-based store where many locals and regulars stop by until midnight! First of all, we made a toast with highballs and ordered tompeiyaki and Okonomiyaki with cheese! We have eaten a hot Okonomiyaki with from a hot iron plate directly ... the season is irresistible! Let's take a quick look at the craftsmanship and actually tasting a Okonomiyaki!
*撮影に際しては、お店の方や周りのお客様に充分配慮して撮影をおこなっています。
いつもありがとうございます!( ´ ▽ ` )
高評価&チャンネル登録もよろしくお願いいたします!
#お好み焼き #へんくつや #広島 #ロイドごはん #フラメンコロイド #職人技 #飯テロ #hiroshima
—————《ロイド のサブチャンネル》—————————————
【フラメンコロイド のサブチャンネルもよろしくお願いします!】
ロイドチャンネル
https://www.youtube.com/channel/UCwNlBAUziFWkJZFY_u3t65A
フラメンコロイド
https://www.youtube.com/channel/UCsFJHNg3SR41R2a3vctUInw
—————《本日の店舗情報》—————————————————
『へんくつや 薬研堀店』
https://www.google.co.jp/amp/s/s.tabelog.com/hiroshima/A3401/A340110/34009354/top_amp/
—————《twitter》—————————————————————
★ロイドごはん
https://twitter.com/roidgohan
★メロンシート
https://twitter.com/meloncito310
★フラメンコロイド
https://twitter.com/flamenkoroid
—————《instagram》———————————————————-
★ロイドごはん
https://www.instagram.com/roidgohan
★メロンシート
https://www.instagram.com/satoshimelo...
★フラメンコロイド
https://www.instagram.com/flamenkoroid
—————《各サイトの情報》—————————————————
★ロイドwalker《人生をドラマチックに彩る旅とグルメと温泉図鑑》
https://ramenjapan.net/
★メロンシート《フラメンコギターの世界一の旅》
https://pordiotama3.xsrv.jp
★フラメンコロイド 《フラメンコロイドの神話と伝説》
https://flamenkoroid.net
—————《ロイドおすすめ動画はこちら》———————————
【お好み焼きシリーズ: Okonomiyaki Series】
https://www.youtube.com/playlist?list=PL6yW17uB9uIXDgAUF90YFXRVbCE2bAIT6
神回【ラーメン二郎の貴重映像】全増しが出来るまで一部始終を大公開!【ラーメン二郎 ひばりヶ丘店】ramen
https://youtu.be/mBFcdMHyaxA
巨大塊肉に挑戦!【いきなりステーキ】2人で1.5キロの結果は?【飯テロ】
https://youtu.be/lxn_oa-rCvQ
一瞬でファンになる86才職人のおすすめラーメン【ほりえラーメン】感動の鹿児島グルメ
https://youtu.be/0IuRURqh4ek
屋台でラーメンが出来上がるまでの職人技をお見せします【ボギー亭 虎ちゃん】味噌ニンニクラーメン【飯テロ】
https://youtu.be/ZJoloTuYOQ4
神技!いつもびっくりするよ!【がんちゃん】お好み焼きの名店に感動!【飯テロ】× フラメンコロイド 広島県
https://youtu.be/8q_j5QX4-vg
消滅する屋台ラーメンの職人技【幸っちゃん】ラーメンの作り方一部始終【ramen】
https://youtu.be/prw-olhOAyI -
locality 在 NDVC - Railway and Airline Youtube 的最佳貼文
2019-06-12 00:27:43WELCOME TO "NDVC - Railway and Airline". "NDVC" ALWAYS LOVE YOU. SUBSCRIBE (FREE) AND CLICK BELL ICON TO RECEIVE LATEST VIDEO NOTICE. THANK YOU VERY MUCH !
CHÀO MỪNG CÁC BẠN ĐÃ ĐẾN XEM KÊNH NDVC - Railway and Airline. "NDVC" LUÔN YÊU THÍCH CÁC BẠN. CÁC BẠN ĐĂNG KÍ (MiỄN PHÍ) VÀ NHẤN CHUÔNG (BÊN CẠNH) ĐỂ NHẬN THÔNG BÁO VIDEO MỚI NHẤT NHÉ! CÁM ƠN CÁC BẠN !
Vietnam Railways: Hello friends ! Today I want to introduce to you the place where my locality is living, that is Bien Hoa City, on the way I am going through the bridge to meet a train from Hanoi to return to the bridge and it goes to Saigon , then I continue to go into the City center and stop there. It is the locality where I live. Thank you very much for watching!!! From Vietnam. -
locality 在 Smart Travel Youtube 的最讚貼文
2013-10-17 10:21:23請用片右下角調HD1080高清睇片。
(文:WIKIPEDIA)
達令港(Darling Harbour)是毗鄰悉尼市中心的一個海港。這也是一個大型娛樂和行人專用區,坐落在悉尼中央商務區的西郊。當地距離唐人街向北延伸,到國王街碼頭在東部,和皮爾蒙特西部郊區的柯克灣兩旁。柯克灣,使達令港,向北進入打開大得多的傑克遜港的水道之一。
達令港(Darling Harbour)被命名為中將拉爾夫·親愛的,誰是新南威爾士州州長, 1825年至1831年之後。它最初是商業港口,包括悉尼的達令港(Darling Harbour)鐵路貨場的一部分。在大蕭條期間,東部的達令港(Darling Harbour) ( Barangaroo項目)成為被稱為飢餓大道,參考水邊的工人尋找工作沿著碼頭。
大部分土地已新南威爾士州鐵路中央編組站和貨運整合中心的網站。查詢到新南威爾士州交通運輸行業,包括鐵路/公路的競爭, ( 1978-80 )根據專員GAVAN麥克多內爾,發現,該中心是低效的,應該被感動,並用於其他公共用途的土地。這些建議採取行動時,由20世紀80年代中期到後期時,該地區已成為在很大程度上被遺棄它是重建公共工程的一項倡議,當時的新南威爾士州部長一行人和旅遊管理區,勞麗布里爾頓。達令港的悉尼會展中心是舉辦2000年夏季奧運會和2007年APEC澳大利亞的一個關鍵會議場地。
Darling Harbour is a harbour adjacent to the city centre of Sydney. It is also a large recreational and pedestrian precinct that is situated on western outskirts of the Sydney central business district. The locality extends northwards from Chinatown, along both sides of Cockle Bay to King Street Wharf on the east, and to the suburb of Pyrmont on the west. Cockle Bay is just one of the waterways that makes up Darling Harbour, which opens north into the much larger Port Jackson.
Darling Harbour is named after Lieutenant-General Ralph Darling, who was Governor of New South Wales from 1825 to 1831. It was originally part of the commercial port of Sydney, including the Darling Harbour Railway Goods Yard. During the Great Depression, the eastern part of Darling Harbour (Barangaroo) became known as The Hungry Mile, a reference to the waterside workers searching for jobs along the wharves.
Much of the land had been the site of the NSW Railways central marshalling yards and freight consolidation centre. The Enquiry into the NSW transport industry, including rail/road competition, (1978--80) under Commissioner Gavan McDonell, found that this centre was inefficient, should be moved, and the land used for other public purposes. These recommendations were acted upon and by the mid-to-late 1980s, when the area had become largely derelict it was redeveloped as a pedestrian and tourist precinct as an initiative of then New South Wales Minister for Public Works, Laurie Brereton. The Sydney Convention and Exhibition Centre at Darling Harbour was a venue of the 2000 Summer Olympic Games and a key meeting venue of APEC Australia 2007.
locality 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
本文延續前篇效能校正的經驗談,上篇文章探討了關於Locality與中斷中可以最佳化的部分,。本篇文章將繼續剩下最佳化步驟的探討。
The Case of the Nosy Neighbor
從前述最後的火焰圖中,作者觀察到幾個跟網路有關的 kernel call,譬如 dev_queue_xmit_nit 以及 __netif_receive_skb_core 等有可能有成長的空間,於是輾轉前往這邊去研究。
作者觀察到 packet_rev 這個函式有不少的比例,而該函式的意思是有人嘗試透過使用 AF_PACKET 等方式開啟了 RAW socket 來處理封包。透過 ss 這個指令,作者觀察到系統中有其他的應用程式透過 AF_PACKET/SOCKET_RAW 也在處理封包,最後輾轉發現原來是系統上的 dhclient。
DHCP Client 必須要在系統有 IP 以前就有收送封包的能力,所以使用 AF_PACKET 也滿合理的。作者思考是否有辦法可以讓 DHCP Client 拿到 IP 之後就關閉 AF_PACKET,改使用純 UDP 的方式來進行後續的 DHCP Renewal 功能,可惜這個方向沒有辦法達成。
根據 AWS 的官方文件,當一個 IP 被分配到一個機器後,這個 IP 會跟該機器同生死,因此這種情況下 其實不需要透過 DHCP Renewal 來反覆取得 IP,只要取得一次 IP 即可。
作者變修改相關腳本,當 DHCP 取得 IP 後關閉 dhclient,此外還必須要記得去修改網卡層級關於該 IP 的記憶,預設期間是一小時,作者將其修改為永遠。
透過這樣簡單的設定,整體的效能又再度提升了 6%,從 1.06M req/s 提升到 1.12M req/s
The Battle Against the Spin Lock
作者陳述自己花了非常多時間與 Spin Lock(作者心魔的大白鯨) 奮戰,幾乎是茶不思飯不想的滿腦都在思考如何加速,然後再經歷過反反覆覆的失敗後,作者最後決定還是要寫出一些關於 Spin Lock 的嘗試與研究心得,算是一個很精彩的踩雷心得。
這部分的篇幅很長,而且內容也滿深的,最後的解決方式也只有提升 2%左右的效能,所以對這部分有興趣的讀者再自行閱讀囉
This Goes to Twelve
終於來到最後的最佳化步驟了,這個步驟中的範疇都只能勉強壓榨出些許的效能,包含了關閉 GRO, TCP壅塞控制以及靜態中斷處理。
(Generic Receive Offload)GRO 是一個網路相關的功能,目的是用來將 Kernel 層級的封包給聚合起來變成一個大封包,而 Kernel 收到這個封包後會把該大封包重新組合變成本來的小封包,對於使用者的應用程式來說不會有任何感覺,但是對於整體的封包傳輸來說能夠節省花費的並提升效能。大部分情況下這個功能都是開啟的,Amazon Linux 2 預設也是打開這個選項。
然而針對作者的測試情境,由於所有的封包基本上都是同一條連線且資料量也不大,因此 GRO 雖然可以帶來聚合的效果,但是也會拖延封包進入到 Linux Kernel Network Stack 的時間點,因此開啟 GRO 帶來的好處沒有很大。
TCP 壅塞控制有不同的演算法,Amazon Linux2 內建兩種演算法 Cubic 以及 Reno,除此這兩個之外常見的還有 Google 多年前貢獻的 BBR。根據作者測試,其實驗環境中有比較好效能的則是 Reno
註: 不同算法針對不同應用場景,所以要切換演算法前要先釐清自己的應用情境以及用哪種演算法比較合適。
全部零零總總的修改後提升了 4%,整體的效能服務來到了 1.2M reqs/s
這篇文章真的很長,有些最佳化的方式是針對該應用場景而特別去使用的,這也意味者並非所有的修正方式都可以套用到各位的應用程式。
本篇文章還是很值得一讀,整個分析的思路與想法都非常有趣,雖然不一定用得到但是也許未來有一天會有機會使用。
https://talawah.io/blog/extreme-http-performance-tuning-one-point-two-million/
locality 在 矽谷牛的耕田筆記 Facebook 的最佳解答
本文延續前篇效能校正的經驗談,上篇文章探討了關於系統呼叫, iptables 可以最佳化的部分,。本篇文章將繼續剩下最佳化步驟的探討。
Perfect Locality
預設情況下, Linux Kernel 會盡量平均地將請求給分配到所有的處理佇列,譬如 network queues, processes, CPUS. 大部分情況下這種機制運作良好不會有太多問題,不過如果今天要追求的不單單只是好的效能,而是極致的效能,則 locality 這個概念就要特別的去注意。
這篇文章中提到很多不同的方式,包含了 CPU Pinning, Receive Side Scaling(RSS), Transmit Packet Sterring(XPS)等,其實用比較簡單的介紹方式就是,希望可以使用固定的 CPU 來處理一條連線上的所有封包(進出),這樣帶來的好處有
1. CPU Cache 可以盡可能的去使用,減少各種 miss 產生的成本
2. 減少 context switch 帶來的成本
3. 減少跨 CPU 之間交換資料帶來的成本
4. 減少 lock 之間帶來的成本
除了 CPU Pin, RSS, XPS 外,還有 irqbalance, smp_affinity_list 等相關的概念需要一併學習,對於這個概念有興趣的讀者非常歡迎去找尋這類型的資料
接者是 SO_REUSEPORT 這個參數,創建 Socket 時使用這個參數能夠使得多個 Process 共用一個連接埠,底層 Kernel 會針對 src/dst{ip/port} 來產生對應的 Hash,並且決定當前封包要送給哪一個 Process。
這個方式搭配前述各種 CPU Pin, 中斷的最佳化則會遇到問題,因為可能底層將該封包送到 CPU2 結果這個函式又把封包重新分配到 CPU0, 這樣就導致該連線要跨 CPU 處理了。
為了解決這個問題, Linux Kernel 4.6 後有新的參數 SO_ATTACH_REUSEPORT_CBPF,使用者可以自行撰寫 BPF 的程式來決定如何分配封包。作者根據這過想法撰寫了一個 BPF 的程式,來確保這個機制可以與前述的最佳化穩定運作。
這次的最佳化帶來的 38% 的成長,這時候的封包處理能力從 603k req/s 提升到 834k req/s
原文中關於這次的最佳化還有一些後續探討,有興趣的可以閱讀
Interrupt Optimizations
當封包透過網路送到網卡後,網卡必須要通知 OS 讓它知道有封包來了,要記得處理。一切處理完畢後網卡就可以繼續等待新的封包過來並且再次發送中斷給 OS 處理封包。這個流程大部分情況也是運作良好,不過當有大量的封包不停傳送來時,頻繁的中斷其實也是會造成不小的額外成本。
為了解決這個問題,目前比較嶄新的網卡都有支援中斷聚合等功能,透過這個功能可以延後中斷一個小週期,而該週期內收到的所有封包只需要透過一次的中斷就可以來處理,藉此降低中斷的次數。更為進階的網卡甚至支援動態自行調整該週期的時間,譬如當網路空閒時,減少週期使得每個封包能夠盡快的發送中斷被處理,而當網路流量很大時則會加大該該週期時間來更有效地處理封包。
註: AWS ENA 有支持這種動態調整的機制
作者基於 AWS 開啟動態調整收端中斷時間的功能,整個效能提升了 14%,從 834k req/s 提升到 955k req/s。作者說這次的調整可以說是整篇文章中幾個非常強的改動,改動的地方少,效能提升明顯,同時背後的隱憂與限制也少。
除了上述中斷的方式外,另外一種則是透過 Busy Polling 這種針對低延遲性的方式。預設情況下其允訓設定為 blocked 的 socket 能夠消耗額外的 CPU Cycle 來讀取接下來的封包,可以將其想成一成一種混合體,當底層網卡告訴我有資料要讀取時,我預期接下來還會有更多的資料,因此我就透過輪詢的方式去多問幾個封包。
由於作者的應用程式是使用 non-blocking 的方式去讀寫封包,所以預設的方式是沒有辦法使用的。而該應用程式又是使用 epoll 來進行底層封包的讀寫。 epoll 於 kenel 4.12 後正式支援 busy polling 的方式,所以這部分就沒有太大的問題。文章中有滿多關於 busy_poll 的一些參數調整。
將這兩個機制給整合後,整體的效能提升達到 28%,從 834k req/s 到達 1060k req/s,同時 99%的 latency 也從 361μs 下降到 292μs.
同時這兩個機制導入後,整個系統每秒產生的硬體中斷數量也從 183k 降到 16k。 Context switches 的數字也從 6k 下降到 1k 左右。
下篇文章會繼續從剩下的三個最佳化策略繼續介紹
https://talawah.io/blog/extreme-http-performance-tuning-one-point-two-million/
locality 在 矽谷牛的耕田筆記 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/