Linux

調試和微調 linux 程序調度器

  • January 14, 2019

在調試零星的 Web 應用程序減速時,我發現所有程序都有相當高的最大調度延遲。

# perf sched record -- sleep 10 && perf sched latency --sort max
-----------------------------------------------------------------------------------------------------------------
 Task                  |   Runtime ms  | Switches | Average delay ms | Maximum delay ms | Maximum delay at       |
-----------------------------------------------------------------------------------------------------------------
 logspout:(7)          |     56.715 ms |     1607 | avg:    9.744 ms | max:  491.840 ms | max at:    270.634788 s
 kubectl:(21)          |    298.298 ms |     3085 | avg:   12.497 ms | max:  474.413 ms | max at:    267.932542 s
 node-health:(6)       |     10.035 ms |      269 | avg:   10.082 ms | max:  301.094 ms | max at:    271.033693 s
 fpm-prometheus-:(45)  |     20.314 ms |      515 | avg:   10.632 ms | max:  295.889 ms | max at:    269.832519 s
 ruby:(2)              |    297.768 ms |      162 | avg:    6.763 ms | max:   87.004 ms | max at:    270.532673 s
 :(3)                  |      0.550 ms |        9 | avg:    9.548 ms | max:   85.826 ms | max at:    271.332980 s
 gitaly-upload-p:(6)   |    142.000 ms |      178 | avg:    2.244 ms | max:   79.394 ms | max at:    271.633055 s
 runc:[2:INIT]:(112)   |     52.745 ms |     3159 | avg:    0.047 ms | max:   70.107 ms | max at:    269.332593 s
 curl:(22)             |     53.576 ms |      144 | avg:    2.325 ms | max:   67.033 ms | max at:    270.132701 s
 php-fpm:(27)          |    807.280 ms |     1925 | avg:    0.259 ms | max:   58.130 ms | max at:    273.032516 s
 [celeryd: celer:(5)   |    513.913 ms |     3569 | avg:    0.089 ms | max:   25.874 ms | max at:    272.733699 s
 ingress-monitor:(5)   |     14.067 ms |      741 | avg:    0.183 ms | max:   19.448 ms | max at:    269.075643 s
 node:(2)              |      9.363 ms |       34 | avg:    0.561 ms | max:    9.014 ms | max at:    267.289700 s
 V8 WorkerThread:(4)   |      3.330 ms |        9 | avg:    1.015 ms | max:    9.007 ms | max at:    267.289690 s
 docker-containe:(398) |    517.011 ms |    17648 | avg:    0.035 ms | max:    6.596 ms | max at:    269.068233 s
 sh:(55)               |    202.641 ms |     1773 | avg:    0.028 ms | max:    5.764 ms | max at:    267.437706 s
 kubelet:(7)           |    717.393 ms |    12067 | avg:    0.036 ms | max:    5.497 ms | max at:    269.068210 s
 dockerd:(60)          |    518.212 ms |     8723 | avg:    0.047 ms | max:    5.273 ms | max at:    273.041616 s
 sshd:(3)              |     25.612 ms |       51 | avg:    0.127 ms | max:    4.655 ms | max at:    270.432617 s
 docker-runc:(198)     |    443.346 ms |    11516 | avg:    0.024 ms | max:    4.262 ms | max at:    270.041672 s
 nginx:(13)            |     14.260 ms |      148 | avg:    0.142 ms | max:    2.483 ms | max at:    269.943108 s
 ksoftirqd/1:16        |     14.604 ms |      686 | avg:    0.032 ms | max:    2.350 ms | max at:    273.459962 s
 runc:[1:CHILD]:(34)   |     17.452 ms |      117 | avg:    0.206 ms | max:    2.257 ms | max at:    267.297665 s

php-fpm 程序花費 58.130 毫秒等待 CPU 執行是否正確?這是否會轉化為 php-fpm 伺服器的響應延遲?

我想像如果在這 60 毫秒內的任何時間點有一個 http 請求,php-fpm 程序將不會處理它,直到它得到 CPU 時間。它是否正確?

總的來說,平均延遲和最大延遲對我來說似乎都很高。

這是在負載為 0.56、1.34、1.05 的 2 CPU 伺服器上的 4.20.0-trunk-amd64 核心(但在 4.18 上相當糟糕)上測量的。沒有記憶體壓力和很少的IO。

我還沒有修改預設調度程序配置,我正在使用預設值:

kernel.sched_cfs_bandwidth_slice_us = 5000
kernel.sched_child_runs_first = 0
kernel.sched_latency_ns = 12000000
kernel.sched_migration_cost_ns = 500000
kernel.sched_min_granularity_ns = 1500000
kernel.sched_nr_migrate = 32
kernel.sched_rr_timeslice_ms = 100
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_schedstats = 0
kernel.sched_tunable_scaling = 1
kernel.sched_wakeup_granularity_ns = 2000000

php-fpm 程序花費 58.130 毫秒等待 CPU 執行是否正確?

現在是從喚醒到上下文切換的時間,所以我想說讓它最終執行需要時間(因此 - “延遲”)

這是否會轉化為 php-fpm 伺服器的響應延遲?

如上所述,它是延遲。但實際上括號中有一個數字——27。我假設它是按名稱分組的所有程序的數字。鑑於 avg 是四分之一毫秒,由於著名的“初步優化是萬惡之源”規則,我建議不要調整調度程序。

在負載為 0.56、1.34、1.05 的 2 CPU 伺服器上

總共有多少個核心?

好的,現在我們知道它是 AWS EC2,IOW,在管理程序下與其他一些客戶的虛擬機一起執行。嗯,這確實改變了很多,實際上。我推薦兩件事:

  1. 當你看到減速時,看看什麼是“偷時間”。或者,更好的是,不斷監控它
  2. 簽出 Redis延遲寫入

PS 我很容易添加“使用專用/裸機伺服器”,但有時它顯然不是一個選項。

引用自:https://serverfault.com/questions/948401