Дополнение к командам Linux — понимание нагрузки на систему

задняя часть Linux
Дополнение к командам Linux — понимание нагрузки на систему

Оригинал: Code Logs (идентификатор общедоступной учетной записи WeChat: codelogs), добро пожаловать в общий доступ, пожалуйста, сохраните источник для перепечатки.

Введение

Это седьмая часть серии дополнений к командам Linux, в которой в основном представлена ​​концепция нагрузки в Linux и метод диагностики проблем.

Указатель статей этой серии
Дополнения к командам Linux — начало работы
Дополнения к командам Linux — обработка текста
Дополнения к командам Linux — наблюдение за программными ресурсами
Дополнения к командам Linux — наблюдение за аппаратными ресурсами
Дополнения к командам Linux — инструменты профилирования
Дополнение к командам Linux — инструмент динамического отслеживания

Как правило, в Unix-подобных системах есть индикатор загрузки системы (средняя загрузка), который используется для описания загруженности системы.Чем больше значение, тем загруженнее система. 

Посмотреть загрузку

$ uptime
19:59:57 up 29 days,  7:08,  1 user,  load average: 0.57, 0.26, 0.18

Обратите внимание на 3 значения после средней нагрузки, которые представляют собой среднюю нагрузку системы за 1 минуту, 5 минут и 15 минут соответственно.Если значение 1 минуты > значение 5 минут > значение 15 минут , это означает, что за последние 15 минут давление в системе увеличилось, и наоборот.  Точно так же в первой строке верхней команды вы также можете увидеть загрузку системы, и ее значение такое же, как и время безотказной работы. 

какова нагрузка

Вообще говоря, системные потоки в основном находятся в следующих трех состояниях: выполняется, готов к выполнению, ожидание блокировки, где работающий поток выполняется на ЦП, работающий поток ожидает планирования ЦП, а заблокированный поток ожидает снятия блокировки. или ио сделано. 

В традиционных unix-системах (таких как BSD) системная нагрузка состоит из запущенных и готовых к выполнению потоков.  Это может хорошо иллюстрировать насыщение процессора, например, 4-ядерного процессора.Если нагрузка всегда выше 4, это означает, что ресурсы процессора насыщены. 

А Linux расширяет определение нагрузки следующим образом: Загрузка Linux состоит из трех частей: запущенные потоки, исполняемые потоки и потоки в состоянии D (обычно ожидающие завершения ввода-вывода). 

Поскольку Linux считает, что, хотя поток в состоянии D не потребляет ресурсы ЦП, он будет потреблять аппаратные ресурсы, такие как диски, сетевые карты, и программные ресурсы, такие как блокировки, поэтому его также следует использовать для расчета нагрузки на систему, что разумно для подумайте, в конце концов, о загрузке системы. Он используется для описания загруженности всей системы, а не только процессора. 

состояние потока D

В Linux потоки имеют следующие общие состояния:

  • R: рабочее или работоспособное состояние
  • S: состояние сна, заблокировано в ожидании пробуждения
  • D: состояние непрерывного сна, обычно ожидание завершения ввода-вывода

На загрузку системы будут влиять потоки в состояниях R и D. Поэтому, когда нагрузка на систему высока, вы можете использовать следующие команды, чтобы узнать, какие потоки ее вызывают:

ps -eLo pid,tid,stat,comm | grep -E " R|D"

Небольшой эксперимент: увеличьте нагрузку на систему до 100

# 使用vfork函数创建一个子进程,子进程如果不调用exec系统调用,它的状态会一直是D。
$ cat uninterruptible.c 
int main() {
    vfork();
    sleep(600);
    return 0;
}
# 编译成可执行程序
$ gcc -o uninterruptible uninterruptible.c

# 运行100个程序
$ for i in {1..100}; do ./uninterruptible &; done

Подождав 1 минуту, вы обнаружите, что загрузка системы возросла почти до 100, а именно:

$ uptime
20:24:42 up 29 days,  7:32,  1 user,  load average: 99.94, 74.82, 35.87

# 可以看到很多D状态的进程
$ ps -eLo pid,tid,stat,pcpu,wchan:32,comm | grep " D"
3774195 3774195 D     0.0 do_fork                          uninterruptible
3774196 3774196 D     0.0 do_fork                          uninterruptible
3774197 3774197 D     0.0 do_fork                          uninterruptible
3774198 3774198 D     0.0 do_fork                          uninterruptible

Как и выше, вы можете увидеть статус потока с помощью команды ps, и есть поле wchan, которое показывает, какая функция ядра в данный момент заблокирована, что может дать некоторые подсказки. 

Кроме того, по/proc/sysrq-triggerВы можете увидеть путь кода, когда поток D заблокирован, следующим образом:

# 写入一个w即可,需要root权限执行
$ echo w > /proc/sysrq-trigger
# 然后内核会把D状态线程调用栈输出到内核日志,这可以通过dmesg查看
$ dmesg 

sysrq
Здесь хорошо видно, что нагрузка увеличивается из-за системного вызова vfork. 

Я представил инструмент offcputime в наборе инструментов bcc ранее. Его можно использовать для рисования графиков пламени вне процессора. Точно так же при диагностике проблем с высокой нагрузкой вы также можете использовать этот инструмент для передачи параметра, чтобы он обращал внимание только на выключенный процессор. поведение потока состояния D. Да, следующим образом:

# ubuntu安装bcc工具集
$ sudo apt install bpfcc-tools
# 使用root身份进入bash
$ sudo bash
# --state 2用于指定抓取TASK_UNINTERRUPTIBLE即D状态线程的offcpu栈
$ offcputime-bpfcc -K --state 2 -f 60  > d_state_offcpu_stack.out
# 绘制为offcpu火焰图
$ awk '{ print $1, $2 / 1000 }' d_state_offcpu_stack.out | ./FlameGraph/flamegraph.pl --color=io --countname=ms > d_state_offcpu.svg

d_state_offcpu

Прошлый контент

Дополнения к командам Linux — начало работы
Оказывается awk действительно артефакт
Навыки работы с текстовыми командами в Linux (часть 1)
Навыки работы с текстовыми командами в Linux (часть 2)
Головоломка с кодировкой символов