<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go的核心goroutine sysmon

          共 1908字,需瀏覽 4分鐘

           ·

          2020-09-17 01:34

          原文作者Vincent Blanchon, 譯者fliter? 地址Go: sysmon, Runtime Monitoring



          插圖來自A Journey With Go,由?Renee French方面提供

          本篇文章基于Go 1.14

          Go 的標(biāo)準(zhǔn)庫提供了一種監(jiān)測應(yīng)用程序的線程,并幫你 (找尋) 程序可能遇到的瓶頸. 該線程稱為sysmon,即系統(tǒng)監(jiān)視器 (system monitor).在GMP 模型中,這個(gè) (特殊) 線程未鏈接任何的 P, 這意味著調(diào)度器 (scheduler) 沒有將其考慮在內(nèi), 因此始終處于運(yùn)行狀態(tài).

          如下是帶有此特殊線程的圖:



          更多關(guān)于GMP模型的內(nèi)容,推薦閱讀作者的另一篇文章?協(xié)程,系統(tǒng)線程及 CPU 管理

          同樣, 通過Go tool trace無法追蹤到此線程.


          Scope

          sysmon線程的作用很廣, 主要涉及以下方面:

          • 由應(yīng)用程序創(chuàng)建的計(jì)時(shí)器 (timers).?sysmon線程查看應(yīng)該在運(yùn)行卻仍在等待執(zhí)行時(shí)間的計(jì)時(shí)器. 在這種情況下, Go 將查看空閑的 M 和 P 列表, 以便盡可能快地運(yùn)行它們.

          • 網(wǎng)絡(luò)輪詢器和系統(tǒng)調(diào)用. 它將運(yùn)行在網(wǎng)絡(luò)操作中被阻塞的 goroutine.

          • 垃圾回收器(如果已經(jīng)很長時(shí)間沒有運(yùn)行). 如果垃圾回收器已經(jīng)兩分鐘沒有運(yùn)行,則 sysmon 將強(qiáng)制執(zhí)行一輪垃圾回收 (GC). 如下是用Go tool trace工具生成的追蹤示例:



          • 長時(shí)間運(yùn)行的 goroutine 的搶占. 任何運(yùn)行時(shí)間超過10 毫秒的 goroutine 都會被搶占, 將運(yùn)行時(shí)間 (running time) 留給其他 goroutine.

          有關(guān)異步搶占的更多信息,推薦閱讀作者 Go:異步搶占


          Pace

          sysmon足夠聰明, 在無事可做時(shí)不會消耗資源. 其周期 (循環(huán)時(shí)間) 是動態(tài)的,取決于正在運(yùn)行的程序的當(dāng)前活動.

          初始速度 (執(zhí)行頻次) 設(shè)置為20 納秒,這意味著sysmon線程一直在尋求 (哪里需要) 幫助. 然后,經(jīng)過幾個(gè)周期, 如果sysmon線程沒有執(zhí)行任何操作, 則兩個(gè)周期之間的休眠將加倍, 直至達(dá)到10 毫秒. 如果應(yīng)用程序沒有很多系統(tǒng)調(diào)用或?長時(shí)間運(yùn)行的 goroutine, 則該線程將在大多數(shù)情形下,回退變?yōu)?span style="box-sizing: border-box;outline-style: none;font-weight: bolder;color: rgb(0, 0, 0);">10 毫秒的延遲 (執(zhí)行頻次),從而給應(yīng)用程序帶來非常小的開銷.

          sysmon線程還能夠檢測其何時(shí)不應(yīng)運(yùn)行, 如以下兩種情況:

          • 垃圾回收器即將要運(yùn)行. (sysmon線程將在垃圾回收結(jié)束時(shí)恢復(fù))

          • 所有線程都處于空閑狀態(tài),沒有任何一個(gè)在運(yùn)行中

          在這兩種情況下,?sysmon都會休眠,從而不會有任何不必要的資源消耗.


          ( 譯者注:Go 并發(fā)的最小邏輯單位叫做 goroutine, 是 Go 為實(shí)現(xiàn)并發(fā)提供的用戶態(tài)線程,這種用戶態(tài)線程運(yùn)行在內(nèi)核態(tài)線程(OS線程)之上,也稱為協(xié)程. 協(xié)程是一種用戶態(tài)的輕量級線程, 其調(diào)度完全由用戶控制. 從技術(shù)角度說,“協(xié)程就是你可以暫停執(zhí)行的函數(shù)”. 協(xié)程擁有自己的寄存器上下文和棧. 協(xié)程調(diào)度切換時(shí), 將寄存器上下文和棧保存到其他地方, 在切回來時(shí),恢復(fù)先前保存的寄存器上下文和棧. 直接操作棧則基本沒有內(nèi)核切換的開銷, 可以不加鎖的訪問全局變量,所以上下文的切換非???

          Go 中的協(xié)程有三種:一種是主 (輕量級) 線程,一種是用來跑 sysmon 的 (輕量級) 線程,一種是普通的 (輕量級) 線程,

          想這樣一個(gè)問題:

          在調(diào)度過程中,如果一個(gè) goroutine 一直占有 CPU 又不會有阻塞或則主動讓出 CPU 的調(diào)度,scheduler 怎么做搶占式調(diào)度讓出 CPU?

          有一個(gè)特殊的 sysmon 線程做搶占式調(diào)度, 當(dāng)一個(gè) goroutine 占用 CPU 超過10 毫秒之后,調(diào)度器會根據(jù)實(shí)際情況提供不保證的協(xié)程切換

          這便是 sysmon 的作用之一 )


          sysmon有關(guān)的源碼, 主要在runtime/proc.goruntime/runtime2.go




          目前Gopher China大會已開啟。關(guān)于大會商務(wù)合作,請聯(lián)系聯(lián)系司徒小姐姐:18516100522 ??


          關(guān)于大會報(bào)名,請點(diǎn)擊“閱讀原文”進(jìn)入活動頁面。但由于目前信息不夠齊備, 也請保持對我們的關(guān)注,后續(xù)會揭開更多驚喜。


          最后,希望每位開發(fā)者永遠(yuǎn)保持不斷提升自己的動力,因?yàn)闊o論外界如何,技術(shù)實(shí)力就是我們的底氣。

          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操小嫩逼视频 | 色香蕉网站 | 日韩精品成人一区二区三区蜜桃 | 国外成人 性视频免费 | 大香蕉午夜福利 |