Onde os valores iniciais do planejador task / kernel / cpu depois da inicialização a frio vêm do Linux?

1

Esta questão está relacionada com um antigo , que contém o plano de fundo completo do meu problema. O resumo desse background é que eu tenho duas VMs quase idênticas e uma delas é muito escalável sob algumas cargas de trabalho com uso intensivo de CPU, com pelo menos algumas I / O envolvidas. Então, o que estou fazendo agora é comparar as saídas de sysctl -a para ambas as VMs e pesquisar as diferenças.

Uma dessas diferenças é em relação ao agendador de tarefas, os valores iniciais após uma inicialização a frio na VM problemática são muito maiores do que no outro. Então estou vagando de onde esses valores vêm inicialmente? Por exemplo. se eles são calculados, quais fatos eles dependem, talvez o VM-host, se eles mudarem em tempo de execução automaticamente, etc. Estimativas sobre se esses valores diferentes poderiam ter qualquer impacto razoável no dimensionamento geral de um sistema são bem-vindos também.

A seguir, exemplos de valores diferentes, enquanto eu apenas forneço uma das 8 vCPUs e as configurações gerais do planejador. As partes importantes de cada vCPU são muito semelhantes.

VM boa vs. ruim:

--- 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

Boa VM:

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

Bad VM:

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
    
por Thorsten Schöning 18.04.2018 / 19:27

1 resposta

0

Recebi uma resposta em outro lugar, que gostaria de documentar e vincular esse tópico:

The initial values are based on your hardware and suggested default values. If the servers are different, ie. different memory, processor; the default values can be different. None of what I see here is going to make much real-world difference. I know the numbers look a lot different, but in real-world terms they're not.

link

Além disso, eu sei com certeza agora que a maioria das diferenças simplesmente vem do fato de que uma VM tinha 2 e as outras 8 vCPUs no momento em que executei sysctl -a . Provavelmente não há cenário global errado ou algo parecido, como eu supus. Eu vejo exatamente os mesmos valores diferentes para, por exemplo, *_interval e sched_*_ns usando algum Ubuntu 14.04 que eu tinha no meu desktop no VMware Workstation com 2 e 8 vCPUs. Completar hardware diferente, VMs etc., os mesmos números.

    
por 20.04.2018 / 10:58