Могутній strace
мене підвів. Як це можливо?
time foo
показує, що foo
запуск займає кілька секунд ("реальний"), але використовує незначний час процесора, як у просторі користувача ("користувач"), так і в ядрі ("sys"). Для допитливих, foo
визначено нижче.
Таким чином, він витрачає більшу частину свого часу на очікування чогось іншого, а не виконання інструкцій процесора. Як правило, я бачу, як він чекає, strace
тобто який системний виклик блокується протягом тривалого періоду часу. На жаль, такий підхід не спрацював.
strace -ttt -T -C -w foo
показує системні дзвінки, часові позначки та підсумок (реального) часу, проведеного в системних викликах. Але саме цей процес показав, що витрачається незначний загальний (реальний) час всередині системних дзвінків.
foo
насправді journalctl -b -u dev-hugepages.mount
. За винятком того, що мені довелося кожен раз міняти останній аргумент на інший системний блок, щоб відтворити це. Іншими словами, затримка, яку я досліджую, сталася вперше, коли я намагаюся отримати журнали для будь-якого одного системного блоку. EDIT : після відповіді на головне запитання я також зрозумів причину виникнення цієї проблеми при відтворенні затримки .
Час, витрачений цим процесом, є специфічним питанням, мабуть, воно відбувається не у всіх системах. https://github.com/systemd/systemd/isissue/7963
journalctl
працює лише один процес. У мене є відчуття, що з journalctl
однієї причини використовується одна додаткова нитка - iirc, був один виклик клона (). Я думаю, це означає, що ви технічно правильні, але це також технічно не має значення для питання. time
розглядає процес в цілому і показав, що процес в цілому досить сонний (блокує щось). strace
не показав достатньо сну. Не має значення, якщо друга нитка спить, головна нитка також повинна бути дуже сонною, щоб пояснити time
результат.