亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Swoole4.4協程搶占式調度器詳解

2024-05-05 00:09:13
字體:
來源:轉載
供稿:網友

前言

Swoole內核團隊開設的專欄,會逐漸投入精力寫文章介紹Swoole的開發歷程,實現原理,應用實踐等,大家可以更好的交流,共同學習,建設PHP生態。

協程調度

去年Swoole推出了4.0版本后,完整的支持PHP協程,我們可以基于協程實現CSP編程,身邊的開發者驚呼,原來PHP代碼還可以這樣寫。Swoole的協程默認是基于IO調度,程序中有阻塞會自動讓出當前協程,協程的各種優勢我們不在這里展開討論。如果是IO密集型的場景,可以表現得很不錯。但是對于CPU密集型的場景,會導致一些協程因為得不到CPU時間片被餓死。

搶占式調度

我們在今年年初就計劃實現Swoole的搶占式調度,以滿足實現有些場景下的不均衡調度帶來的問題。我們中間經歷了幾個版本,在這里和大家分享一下開發過程中的動機和解決辦法。

Swoole,協程搶占式,調度器

我們目的是為了均衡調度每個協程的CPU時間,比如協程3需要比較長的執行時間,我們必須把協程3的CPU時間主動中斷,而不依賴IO事件,使得每個協程得到平均的執行時間。

起初,我們的想法是可以從PHP的循環中自動檢測執行實踐,若達到限制,可以自動讓出當前協程。因為畢竟很少有人一馬平川的寫出占用很多CPU的代碼,大都通過循環條件來控制。我們hook循環指令,每次執行循環指令的時候,都來檢查協程的執行時間,我們很欣喜的得到了最初的版本。但是這樣做比較hack,而且opcode經過opcache優化后,情況會變得有些復雜。

后來我們使用PHPticks機制,也就是在PHP代碼編譯期間,注入ticks指令,可以執行相應的函數,我們可以在這些函數中檢測處理協程的時間,達到搶占式的效果,但是這里有一個問題,PHPdeclare(ticks=N)語法,只對當前腳本范圍有效,也就是說項目稍微大點,require或者include進來的腳本,并不會自動注入ticks指令,這樣Swoole開發者幾乎是無法接受的。我們也試圖給PHP官方提一個PR,可以在擴展層設置一個全局默認的ticks,但是官方不愿意采納我們的提交,因為官方覺得這個功能對性能損耗比較大,而且有可能在PHP8移除這個功能。其實經過實測這個性能損耗并不大,而且我們已經在生產環境驗證,并取得了顯著的效果,即可以讓出某些CPU密集的邏輯部分,使得服務整個相應時間更加均衡。

下圖是我們生產環境一個RPC接口的調用端統計數據對比,客戶端等待超時時間為2s,超時則統計為錯誤。

Swoole,協程搶占式,調度器

左邊一側是沒有搶占式調度,右側是開了搶占式調度,可以發現,左側總是會有偶爾超時情況,而經過優化之后,沒有一個超時的請求,請求響應時間非常平滑,提升了服務的穩定性。

Swoole,協程搶占式,調度器

可以從上圖看出,由于搶占式調度的加入,去除了請求耗時高的毛刺,使得平均請求時間變得更加平滑,穩定。

想要做搶占式調度,對于PHP來說,有兩個途徑

  • 單線程的PHP的執行流,通過執行指令做文章,可以在PHP執行流程中注入邏輯,以檢查執行時間,再加上Swoole的協程能力,可以在不同的協程中切換,以達到搶占CPU的目的。
  • 考慮開線程,負責檢查當前執行協程執行時間。

經過以上辦法的嘗試,注入指令的路數基本是無法得到官方的支持,我們只能另謀出路,多開一個線程,只負責檢查當前協程。具體的做法是,利用PHP-7.1.0引入的VM interrupt機制,默認每隔5ms檢查一下當前協程是否達到最大執行時間,默認為10ms,如果超過,則讓出當前協程,達到被其他協程搶占的目的。

示例代碼

需要Swoole 4.4或更高版本
<?phpCo::set(['enable_preemptive_scheduler' => 1]);$start = microtime(1);echo "start/n";$flag = 1;go(function () use (&$flag) { echo "coro 1 start to loop/n"; $i = 0; for (;;) {  if (!$flag) {   break;  }  $i++; } echo "coro 1 can exit/n";}); $end = microtime(1);$msec = ($end - $start) * 1000;echo "use time $msec/n";go(function () use (&$flag) { echo "coro 2 set flag = false/n"; $flag = false;});echo "end/n";

執行結果

startcoro 1 start to loopuse time 11.121988296509coro 2 set flag = falseendcoro 1 can exit

可以發現,代碼邏輯可以從第一個協程的死循環中自動yield出來,執行第二個協程,如果沒有這個特性,第二個協程永遠不會被執行,導致被餓死。而這樣做,第二個協程可以順利被執行,最后執行結束后,第一個協程也會接著繼續往下執行。達到我們的第二個協程主動搶占第一個協程CPU的效果。

這個特性在生產環境非常有用,尤其是對于實時系統或者響應時間比較敏感的場景。

最后

感謝大家對 Swoole 的長期支持和關注。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产区精品在线观看| 日韩视频亚洲视频| 国产精品第一视频| 91影院在线免费观看视频| 久久久国产精品x99av| 欧美精品久久久久久久久久| 成人黄色激情网| 欧美黄色三级网站| 亚洲成年人影院在线| 国产精品久久77777| 午夜精品久久久久久久久久久久| 国产精品久久久久久久久久新婚| 精品无人区太爽高潮在线播放| 国产在线拍揄自揄视频不卡99| 亚洲国产精品va在线看黑人| 国产精品视频在线观看| 日韩中文字幕国产精品| 国产激情视频一区| 欧美激情亚洲激情| 成人国产亚洲精品a区天堂华泰| 国产精品爱啪在线线免费观看| 日韩精品免费在线视频| 成人精品一区二区三区电影免费| 91精品国产91久久久久久不卡| 大胆欧美人体视频| 欧美二区在线播放| 精品一区电影国产| 欧美另类99xxxxx| 国产成人一区二区三区小说| 欧美性在线视频| 日韩精品在线观看一区二区| 美乳少妇欧美精品| 成人黄色av免费在线观看| 色婷婷av一区二区三区在线观看| 国产中文字幕日韩| 久久91精品国产| 亚洲大胆人体av| 亚洲欧美制服另类日韩| 色狠狠av一区二区三区香蕉蜜桃| 日本19禁啪啪免费观看www| 久久夜色精品国产| 一区二区三区国产视频| 欧美福利视频在线| 午夜精品久久久99热福利| 欧美激情三级免费| 色黄久久久久久| 久久精品国产一区二区三区| 久久国产精品久久久久久| 一本大道香蕉久在线播放29| 日韩黄在线观看| 欧美激情欧美激情在线五月| 91精品国产自产在线| 亚洲伊人一本大道中文字幕| 97av在线视频| 国产精品一区二区久久久久| www.日韩.com| 91免费看视频.| 欧美一级片久久久久久久| 国产精品丝袜视频| 日韩影视在线观看| 97香蕉久久夜色精品国产| 国产91精品不卡视频| 亚洲男人的天堂在线| 日韩欧美中文在线| 色悠悠国产精品| 精品少妇一区二区30p| 秋霞成人午夜鲁丝一区二区三区| 国模精品视频一区二区| 亚洲午夜久久久影院| 91av在线看| 久久亚洲综合国产精品99麻豆精品福利| 久久免费观看视频| 亚洲bt欧美bt日本bt| 亚洲欧美激情精品一区二区| 国产一区二区三区视频在线观看| 日本91av在线播放| 久色乳综合思思在线视频| 国产精品九九久久久久久久| 精品av在线播放| 欧美三级免费观看| 热re91久久精品国99热蜜臀| 欧美午夜视频在线观看| 欧美成aaa人片在线观看蜜臀| 美女国内精品自产拍在线播放| 精品久久久在线观看| 人体精品一二三区| 日韩av综合中文字幕| 久久久久久久激情视频| 国产女人18毛片水18精品| 91中文在线观看| 国产视频精品一区二区三区| 久久久www成人免费精品张筱雨| 国产激情久久久| 久久精品国产亚洲7777| 精品视频—区二区三区免费| 亚洲精品久久视频| 青草热久免费精品视频| 日韩欧美中文字幕在线播放| 国产一区玩具在线观看| 中文字幕亚洲欧美在线| 欧美日韩国产成人在线| 亚洲精品色婷婷福利天堂| 日韩av影院在线观看| 美女av一区二区| 亚洲精品欧美极品| 亚洲国产精品大全| 另类天堂视频在线观看| 亚洲欧美变态国产另类| 国产成人在线一区二区| 国产精品草莓在线免费观看| 一本大道久久加勒比香蕉| 欧美日韩一区二区三区| 亚洲精品理论电影| 亚洲欧美日韩久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩中文字幕在线看| 91成品人片a无限观看| 在线视频精品一| 国产不卡一区二区在线播放| 欧美理论电影在线播放| 国产精品丝袜久久久久久不卡| 亚洲女人被黑人巨大进入| 色先锋资源久久综合5566| 97久久超碰福利国产精品…| 庆余年2免费日韩剧观看大牛| 亚洲国产精品va在看黑人| 亚洲第一国产精品| 欧美性xxxxx| 欧美日韩性视频在线| 精品久久香蕉国产线看观看亚洲| 日韩亚洲第一页| 精品视频在线播放| 97超级碰碰碰| 91精品久久久久久久久中文字幕| 欧美国产日韩一区二区| 97在线免费观看视频| 国产一区私人高清影院| 成人午夜激情网| 亚洲精品一区久久久久久| 欧美小视频在线| 亚洲天天在线日亚洲洲精| 亚洲欧美另类国产| 青草青草久热精品视频在线网站| 国产做受69高潮| 蜜臀久久99精品久久久久久宅男| 欧美激情精品久久久久久久变态| 久久视频在线视频| 亚洲精品福利在线| 操日韩av在线电影| 欧美视频免费在线观看| 亚洲国产美女久久久久| 国产精品黄色影片导航在线观看| 欧美激情综合亚洲一二区| 国产精品麻豆va在线播放| 粉嫩av一区二区三区免费野| 亚洲最新中文字幕| 国产精品久久久久久影视| 伊人亚洲福利一区二区三区| 久久99精品久久久久久噜噜| 欧美成人中文字幕在线| 日韩成人中文字幕在线观看| 国产成人精品久久亚洲高清不卡| 日韩欧美中文免费| 国产香蕉一区二区三区在线视频|