好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Swoole4.4協(xié)程搶占式調(diào)度器詳解

Swoole4.4協(xié)程搶占式調(diào)度器詳解

熱門標簽:廣東廣州在怎么申請400電話 開發(fā)地圖標注類網(wǎng)站 百度地圖怎樣標注圖標 百度地圖標注偏差 電銷機器人問門薩維品牌my 外呼系統(tǒng)能給企業(yè)帶來哪些好處 咸寧銷售電銷機器人系統(tǒng) 余姚電話機器人 400電話蘭州申請請

前言

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

協(xié)程調(diào)度

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

搶占式調(diào)度

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

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

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

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

下圖是我們生產(chǎn)環(huán)境一個RPC接口的調(diào)用端統(tǒng)計數(shù)據(jù)對比,客戶端等待超時時間為2s,超時則統(tǒng)計為錯誤。


左邊一側(cè)是沒有搶占式調(diào)度,右側(cè)是開了搶占式調(diào)度,可以發(fā)現(xiàn),左側(cè)總是會有偶爾超時情況,而經(jīng)過優(yōu)化之后,沒有一個超時的請求,請求響應時間非常平滑,提升了服務的穩(wěn)定性。


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

想要做搶占式調(diào)度,對于PHP來說,有兩個途徑

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

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

示例代碼

需要Swoole 4.4或更高版本
?php
Co::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";

執(zhí)行結果

start
coro 1 start to loop
use time 11.121988296509
coro 2 set flag = false
end
coro 1 can exit

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

這個特性在生產(chǎn)環(huán)境非常有用,尤其是對于實時系統(tǒng)或者響應時間比較敏感的場景。

最后

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 在Laravel5.6中使用Swoole的協(xié)程數(shù)據(jù)庫查詢
  • 關于Curl在Swoole協(xié)程中的解決方案詳析

標簽:鷹潭 十堰 銅陵 巴彥淖爾 臨沂 麗江 重慶 衡陽

巨人網(wǎng)絡通訊聲明:本文標題《Swoole4.4協(xié)程搶占式調(diào)度器詳解》,本文關鍵詞  Swoole4.4,協(xié)程,搶占,式,調(diào)度,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Swoole4.4協(xié)程搶占式調(diào)度器詳解》相關的同類信息!
  • 本頁收集關于Swoole4.4協(xié)程搶占式調(diào)度器詳解的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 456成年女人免费视频| 钰慧番外篇| 37大但人文艺术a级| 妺妺扒开裤子自慰给我看| wwxxxxx免费| 国产精品网站在线观看| 欧美精品一区二区久久丰满湿润| 国產又粗又猛又爽又黄| 免费一级毛片毛毛片A片18按摩| 日本三级私人电影网| 日本国产一区二区三区| 国产精品变态重口在线| 国产精品久久久久久影视| 久久AV秘?一区二区三区水牛| 性姿势72式真人动态图软件| 天堂WWW在线无码免费下载| 美女又?又黄?视频| 成年女人视频免费免费看| 开局退婚十个未婚妻| 天天干狠狠| 国产精品一区二Av18款| 国产三级理论片| 51草莓社区在线视频| 同桌隔着内裤摸出了好多水| 美女巨胸喷奶水gif放肆吧| 影音先锋下载中文字幕资源| 国产无精乱码一区二区三区 | 王者貂蝉本子h全彩| 国产成人无码精品久久久露脸| 宝贝你的小兔兔那么可爱| 600图库大全免费资料图| 沦为性玩物的s大校花文| 制服诱惑视频| 国产精品萌白酱在线观看| 日本片入室侵犯系列| 国产一级A片无码免费出租车司机| 男人把女人躁得呻吟| 国产欧美亚洲精品a| 你是我的女人未删减版| 秀色秀场直播| 久久午夜免费鲁丝片|