Могутній 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результат.