调试和微调 Linux 进程调度程序

调试和微调 Linux 进程调度程序

在调试偶尔出现的 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 时间。这是正确的吗?

总体而言,平均延迟和最大延迟对我来说似乎都非常高。

这是在 4.20.0-trunk-amd64 内核上测得的(但 4.18 内核的表现同样糟糕),在 2 CPU 服务器上,负载分别为 0.56、1.34、1.05。没有内存压力,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

答案1

php-fpm 进程花费了 58.130 毫秒等待 CPU 运行,对吗?

从唤醒到上下文切换的时间,所以我说这是让它最终运行所需的时间(因此称为“延迟”)

这是否意味着 php-fpm 服务器的响应延迟?

如上所述,这是延迟。但实际上括号中有一个数字 — 27。我假设它是按名称分组的所有进程的数字。鉴于平均值是四分之一毫秒,我建议不是调整调度程序是由于著名的“初步优化是一切罪恶的根源”规则。

在 2 CPU 服务器上,负载为 0.56、1.34、1.05

总共有多少个核心?

好的,现在我们知道它是 AWS EC2,也就是说,在虚拟机管理程序下运行与其他一些客户的虚拟机。嗯,实际上,这确实发生了很大变化。我建议做两件事:

  1. 查看什么是“偷时间“当你看到速度变慢时。或者,更好的方法是不断监控它
  2. 结帐 Redis延迟写入

PS 我可以轻松添加“使用专用/裸机服务器”,但有时这显然不是一个选择。

相关内容