Оригинал: 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
Здесь хорошо видно, что нагрузка увеличивается из-за системного вызова 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
Прошлый контент
Дополнения к командам Linux — начало работы
Оказывается awk действительно артефакт
Навыки работы с текстовыми командами в Linux (часть 1)
Навыки работы с текстовыми командами в Linux (часть 2)
Головоломка с кодировкой символов