linux "top" команда: что мы используем, sy, ni, id, wa, hi, si и st (для использования процессора)?

<p>когда я выдаю <code>top</code> в linux, я получаю результат, подобный следующему:</p><p><img src="https://i.stack.imgur.com/ijasr.jpg" alt="screenshot of top"></p><p>одна из строк имеет информацию об использовании процессора, представленную следующим образом:</p><pre><code>cpu(s): 87.3%us, 1.2%sy, 0.0%ni, 27.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st </code></pre><p>хотя я знаю определения каждого из них (намного ниже), я не понимаю, что именно означают эти задачи.</p><ul> <li><code>hi</code> - что означает обслуживание аппаратных прерываний?</li> <li><code>si</code> - что означает обслуживание программных прерываний?</li> <li><code>st</code> - они говорят, что это "время цп в вынужденном ожидании виртуального цп, пока гипервизор обслуживает другой процессор (или)% времени цп, украденного с виртуальной машины".</li> </ul><p>но что это на самом деле означает? кто-то может быть более ясным?</p><p>я перечислил все <code>us</code>, <code>sy</code>, <code>ni</code> и т.д., потому что это может помочь другим в поиске того же самого. этой информации нет в справочных страницах.</p><pre><code>us: user cpu time (or) % cpu time spent in user space sy: system cpu time (or) % cpu time spent in kernel space ni: user nice cpu time (or) % cpu time spent on low priority processes id: idle cpu time (or) % cpu time spent idle wa: io wait cpu time (or) % cpu time spent in wait (on disk) hi: hardware irq (or) % cpu time spent servicing/handling hardware interrupts si: software irq (or) % cpu time spent servicing/handling software interrupts st: steal time - - % cpu time in involuntary wait by virtual cpu while hypervisor is servicing another processor (or) % cpu time stolen from a virtual machine </code></pre>

<p><code>hi</code> - время, потраченное на обработку аппаратных прерываний. аппаратные прерывания генерируются аппаратными устройствами (сетевыми картами, контроллером клавиатуры, внешним таймером, аппаратными датчиками и т.д.), когда им нужно что-то сигнализировать цпу (например, поступили данные).</p><p>поскольку это может происходить очень часто, и поскольку они по существу блокируют текущий процессор во время их работы, аппаратные обработчики прерываний ядра пишутся так быстро и просто, насколько это возможно.</p><p>если требуется длительная или сложная обработка, эти задачи откладываются с помощью вызова механизма <code>softirqs</code>. они запланированы независимо, могут работать на любом процессоре, могут даже работать одновременно (ничего из этого не относится к аппаратным обработчикам прерываний).</p><p><sub>часть о жестких irq, блокирующих текущий процессор, и часть о том, что <code>softirqs</code> может работать в любом месте, не совсем верны, могут быть ограничения, и некоторые жесткие irq могут прерывать другие.</sub></p><p>например, аппаратное прерывание "полученные данные" от сетевой карты может просто хранить информацию о том, что "карта ethx нуждается в обслуживании" где-то и планировать <code>softirq</code>. <code>softirq</code> - это то, что запускает фактическую маршрутизацию пакетов.</p><p><code>si</code> представляет время, проведенное в этих <code>softirqs</code>.</p><p>хорошее прочтение о механизме <code>softirq</code> (с небольшой историей) - книга мэтью уилкокса <a href="https://www.cs.unca.edu/brock/classes/spring2013/csci331/notes/paper-1130.pdf">я сделаю это позже: softirqs, тасклеты, нижние половины, очереди задач, рабочие очереди и таймеры</a> = (pdf, 64k).</p><p><code>st</code>, "время кражи", относится только к виртуализированным средам. он представляет время, когда реальный цп был недоступен для текущей виртуальной машины - он был "украден" из этого vm гипервизором (либо для запуска другой вм, либо для собственных нужд).</p><p>документ <a href="https://www.ibm.com/developerworks/linux/linux390/perf/tuning\_cputimes.html">учёт времени цп</a> от ibm содержит больше информации о времени кражи и учете цп в виртуализированных средах. (он предназначен для аппаратного обеспечения типа zseries, но общая идея одинакова для большинства платформ.)</p>

<ul> <li>нас - время, проведенное в пространстве пользователя</li> <li>sy - время, проведенное в пространстве ядра</li> <li>ni - время, затраченное на выполнение пользовательских процессов с ограничениями (пользовательский приоритет)</li> <li>id - время, проведенное в режиме ожидания</li> <li>wa - время, потраченное на ожидание на io периферийные устройства (например, диск)</li> <li>привет - время, потраченное на обработку процедур аппаратного прерывания. (всякий раз, когда периферийное устройство хочет внимания от процессора, оно буквально тянет линию, чтобы сигнализировать процессору об обслуживании)</li> <li>si - время, потраченное на обработку программных прерываний. (фрагмент кода вызывает подпрограмму прерывания ...)</li> <li>st - время, затрачиваемое на принудительное ожидание виртуальным процессором, пока гипервизор обслуживает другой процессор (украденный с виртуальной машины)</li> </ul>

<p>значение "st" может быть просто объяснено с помощью экземпляра t2.micro ec2 от aws.</p><p>в <a href="https://docs.aws.amazon.com/awsec2/latest/userguide/burstable-credits-baseline-concepts.html">документация aws</a> вы можете прочитать, что вы получаете только 10% базовой производительности на vcpu. это означает, что если у вас есть процесс, который потребляет много процессорного времени, значение "st" останется около 90, поскольку вам разрешено использовать только 10% vcpu. сумма других значений останется около 10.</p><p>таким образом, aws использует гипервизор, чтобы предоставить вам доступ только к определенной вычислительной мощности. это замедляет вас намеренно, так как вы используете только низкоуровневый тип экземпляра.</p><p>я надеюсь, что это немного облегчает понимание.</p>