Linux 冷启动后的初始任务/内核/CPU 调度程序值来自哪里?

Linux 冷启动后的初始任务/内核/CPU 调度程序值来自哪里?

这个问题与前任,其中包含我的问题的完整背景。该背景的摘要是,我有两个几乎相同的虚拟机,其中一个在某些 CPU 密集型工作负载下扩展性非常差,我认为至少涉及一些 I/O。所以我现在正在做的是比较sysctl -a两个虚拟机的输出并研究差异。

其中一个差异是关于任务调度程序的,有问题的虚拟机冷启动后的初始值比另一个虚拟机上的初始值高得多。所以我想知道这些价值观最初来自哪里?例如,如果它们被计算,它们依赖于哪些事实,可能是VM主机,它们是否在运行时自动更改等等。我们也欢迎评估这些不同的值是否会对系统的整体扩展产生任何合理影响。

以下是不同值的示例,而我仅提供了 8 个 vCPU 中的一个和整体调度程序设置。每个 vCPU 的重要部分看起来非常相似。

好的虚拟机与坏的虚拟机:

--- C:/Users/tschoening/Desktop/Good VM.txt Mi 18. Apr 19:24:47 2018
+++ C:/Users/tschoening/Desktop/Bad VM.txt  Mi 18. Apr 19:24:44 2018
@@ -8,3 +8,3 @@ kernel.sched_domain.cpu0.domain0.imbalance_pct = 1
-kernel.sched_domain.cpu0.domain0.max_interval = 4
-kernel.sched_domain.cpu0.domain0.max_newidle_lb_cost = 75519
-kernel.sched_domain.cpu0.domain0.min_interval = 2
+kernel.sched_domain.cpu0.domain0.max_interval = 16
+kernel.sched_domain.cpu0.domain0.max_newidle_lb_cost = 155384
+kernel.sched_domain.cpu0.domain0.min_interval = 8
@@ -15 +15 @@ kernel.sched_domain.cpu0.domain0.wake_idx = 0
-kernel.sched_latency_ns = 12000000
+kernel.sched_latency_ns = 24000000
@@ -17 +17 @@ kernel.sched_migration_cost_ns = 500000
-kernel.sched_min_granularity_ns = 1500000
+kernel.sched_min_granularity_ns = 3000000
@@ -25 +25 @@ kernel.sched_tunable_scaling = 1
-kernel.sched_wakeup_granularity_ns = 2000000
+kernel.sched_wakeup_granularity_ns = 4000000

良好的虚拟机:

kernel.sched_domain.cpu0.domain0.busy_factor = 32
kernel.sched_domain.cpu0.domain0.busy_idx = 2
kernel.sched_domain.cpu0.domain0.cache_nice_tries = 1
kernel.sched_domain.cpu0.domain0.flags = 4143
kernel.sched_domain.cpu0.domain0.forkexec_idx = 0
kernel.sched_domain.cpu0.domain0.idle_idx = 1
kernel.sched_domain.cpu0.domain0.imbalance_pct = 125
kernel.sched_domain.cpu0.domain0.max_interval = 4
kernel.sched_domain.cpu0.domain0.max_newidle_lb_cost = 75519
kernel.sched_domain.cpu0.domain0.min_interval = 2
kernel.sched_domain.cpu0.domain0.name = DIE
kernel.sched_domain.cpu0.domain0.newidle_idx = 0
kernel.sched_domain.cpu0.domain0.wake_idx = 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 = 25
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_shares_window_ns = 10000000
kernel.sched_time_avg_ms = 1000
kernel.sched_tunable_scaling = 1
kernel.sched_wakeup_granularity_ns = 2000000

虚拟机损坏:

kernel.sched_domain.cpu0.domain0.busy_factor = 32
kernel.sched_domain.cpu0.domain0.busy_idx = 2
kernel.sched_domain.cpu0.domain0.cache_nice_tries = 1
kernel.sched_domain.cpu0.domain0.flags = 4143
kernel.sched_domain.cpu0.domain0.forkexec_idx = 0
kernel.sched_domain.cpu0.domain0.idle_idx = 1
kernel.sched_domain.cpu0.domain0.imbalance_pct = 125
kernel.sched_domain.cpu0.domain0.max_interval = 16
kernel.sched_domain.cpu0.domain0.max_newidle_lb_cost = 155384
kernel.sched_domain.cpu0.domain0.min_interval = 8
kernel.sched_domain.cpu0.domain0.name = DIE
kernel.sched_domain.cpu0.domain0.newidle_idx = 0
kernel.sched_domain.cpu0.domain0.wake_idx = 0

kernel.sched_latency_ns = 24000000
kernel.sched_migration_cost_ns = 500000
kernel.sched_min_granularity_ns = 3000000
kernel.sched_nr_migrate = 32
kernel.sched_rr_timeslice_ms = 25
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_shares_window_ns = 10000000
kernel.sched_time_avg_ms = 1000
kernel.sched_tunable_scaling = 1
kernel.sched_wakeup_granularity_ns = 4000000

答案1

在其他地方得到了答案,我想记录并链接该线程:

初始值基于您的硬件和建议的默认值。如果服务器不同,即不同的内存、处理器;默认值可能会不同。我在这里看到的任何东西都不会对现实世界产生太大的影响。我知道这些数字看起来有很大不同,但在现实世界中它们并没有太大的不同。

https://www.linuxquestions.org/questions/linux-software-2/where-do-initial-task-kernel-cpu-scheduler-values-after-cold-boot-come-from-4175627988/#post5845481

除此之外,我现在可以肯定,大多数差异只是因为我执行时一个虚拟机有 2 个 vCPU,而另一个有 8 个 vCPU sysctl -a。很可能没有像我假设的那样出现错误的全局设置或类似情况。我看到完全相同的不同值,例如,*_interval使用sched_*_ns我在 VMware Workstation 中的桌面上的 Ubuntu 14.04,分别有 2 个和 8 个 vCPU。完全不同的硬件、虚拟机等,相同的数字。

相关内容