[Moscow.pm] Распределение user и system time для пустого цикла

Ilya Chesnokov chesnokov.ilya на gmail.com
Чт Фев 21 07:34:06 PST 2019


Всем привет.

Недавно заметил, что на моей виртуальной машине с FreeBSD
10.4-RELEASE-p13, работающей под VirtualBox, запущенным под Linux
(4.18.0-15-generic #16-Ubuntu SMP), творятся странные вещи.

Любой код, использующий модуль Benchmark (в том числе тесты для
некоторых CPAN-модулей, например DBIx::Class, Devel::NYTProf) на 100%
загружают CPU и вообще выполняется очень долго. После некоторого
исследования обнаружилось, что причиной тому - вот эта вот строчка:
https://metacpan.org/source/SHAY/perl-5.28.1/lib/Benchmark.pm#L718
Т.е., Benchmark ждет, пока изменится user time, и только после этого
продолжает работать.

Почему-то на моей виртуалке такая вот "пустая" операция, какой
является Benchmark->new() занимает очень мало user time и очень много
system time. При этом на хост-системе они приблизительно равны или
user time даже больше. Для определения этого я написал вот такой
однострочник:

time perl -E '$|++; $SIG{ALRM} = sub { die "alarm\n"; }; alarm 1; say
join " ", times while 1'

На виртуалке последняя строчка примерно такая: 0.015625 0.9921875 0 0
На хост-машине такая: 0.62 0.38 0 0

Т.е. видно, что на виртуалке для пустого цикла user time почти не
меняется, что приводит к долгому прогону цикла в модуле Benchmark.

Есть идеи, почему это так, и как это исправить?

-- 
Best regards,
Ilya Chesnokov


Подробная информация о списке рассылки Moscow-pm