Инструменты пользователя

Инструменты сайта


proccess_and_resurce

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
proccess_and_resurce [2016/01/19 02:23]
sander [Ошибки из-за отсутствия страниц]
proccess_and_resurce [2016/01/19 02:59] (текущий)
sander [Отслеживание производительности процессора и памяти с помощью команды vmstat]
Строка 1: Строка 1:
 +====== Подробное рассмотрение процессов и использования ресурсов ======
 +===== Отслеживание процессов =====
 +**top**\\
  
 +**Инструкции для команды top**
 +|Инструкция|Действие|
 +|Клавиша Пробел|Немедленно обновить экран|
 +|M|Выполнить сортировку по количеству используемой резидентной памяти|
 +|T|Выполнить сортировку по общему (кумулятивному) применению ЦПУ|
 +|P|Выполнить сортировку по текущему использованию ЦПУ (по умолчанию)|
 +|u|Отобразить процессы только для одного пользователя|
 +|f|Выбрать другие параметры для отображения|
 +|?​|Отобразить статистику использования всех команд top|
 +===== Поиск открытых файлов с помощью команды lsof =====
 +<WRAP center round info 80%>
 +Команда lsof перечисляет открытые файлы и процессы,​ которые их используют. Поскольку Unix делает существенный акцент на файлах,​ команда lsof входит в число самых полезных инструментов для отыскания неполадок. Однако эта команда не ограничивается обычными файлами — она может перечислять сетевые ресурсы,​ динамические библиотеки,​ каналы и многое другое.
 +</​WRAP>​
 +==== Чтение результатов вывода команды lsof ====
 +  * **COMMAND.** Командное имя для процесса,​ который удерживает дескриптор файла.
 +  * **PID.** Идентификатор процесса.
 +  * **USER.** Пользователь,​ запустивший процесс.
 +  * **FD.** Это поле может содержать два типа элементов. В приведенном выше результате столбец FD показывает назначение файла. Это поле может также содержать файловый дескриптор открытого файла — число, которое процесс использует вместе с системными библиотеками и ядром, чтобы идентифицировать файл и работать с ним.
 +  * **TYPE.** Тип файла (обычный файл, каталог,​ сокет и т. п.).
 +  * **DEVICE.** Старший и младший номера устройства,​ которое удерживает данный файл.
 +  * **SIZE.** Размер файла.
 +  * **NODE.** Номер дескриптора inode для данного файла.
 +  * **NAME.** Имя файла.
 +
 +===== Потоки =====
 +==== Однопоточные и многопоточные процессы ====
 +<WRAP center round info 80%>
 +В Linux некоторые процессы разделены на части, называемые потоками. Поток очень похож на процесс:​ у него есть идентификатор (TID, или ID потока),​ и ядро планирует запуск потоков и запускает их так же, как и процессы. Однако в отличие от отдельных процессов,​ которые обычно не используют совместно с другими процессами такие системные ресурсы,​ как оперативная память и подключение к вводу/​выводу,​ все потоки внутри какого-либо процесса совместно задействуют ресурсы системы и некоторую часть памяти.
 +</​WRAP>​
 +=== Просмотр потоков ===
 +<code bash>
 + ps m -o pid,​tid,​command
 +  PID   TID COMMAND
 + ​5365 ​    - /​usr/​bin/​python /​usr/​lib64/​xsconsole/​XSConsole.py -f root
 +    -  5365 -
 + ​5366 ​    - /​sbin/​mingetty tty3
 +    -  5366 -
 + ​5367 ​    - /​sbin/​mingetty tty4
 +    -  5367 -
 + ​5368 ​    - /​sbin/​agetty hvc0 115200 linux
 +    -  5368 -
 + ​5384 ​    - /bin/bash /​opt/​xensource/​libexec/​dom0term.sh
 +    -  5384 -
 +11074     - sudo -i
 +    - 11074 -
 +11131     - -bash
 +    - 11131 -
 +17621     - vi backup_vm_bash
 +    - 17621 -
 +19499     - sudo -i
 +    - 19499 -
 +19527     - -bash
 +    - 19527 -
 +25957     - ps m -o pid,​tid,​command
 +    - 25957 -
 +
 +</​code>​
 +
 +===== Измерение процессорного времени =====
 +
 +Чтобы отследить один или несколько процессов с течением времени,​ используйте параметр -p в команде top с таким синтаксисом:​
 +<code bash>
 +$ top -p pid1 [-p pid2 ...]
 +</​code>​
 +
 +===== Память =====
 +<WRAP center round info 80%>
 +Один из самых простых способов проверить состояние системной памяти в целом — запустить команду **free** или посмотреть файл **/​proc/​meminfo**,​ чтобы понять,​ сколько реальной памяти используется для кэша и буферов.
 +</​WRAP>​
 +
 +==== Как работает память ====
 +
 +В процессоре присутствует **модуль управления памятью (MMU)**, который переводит виртуальные адреса памяти,​ используемые процессами,​ в реальные. Ядро помогает модулю **MMU**, разбивая память на маленькие фрагменты,​ называемые **страницами**. Ядро содержит структуру данных,​ которая называется **таблицей страниц** и содержит схему соответствия виртуальных адресов страниц реальным адресам страниц в памяти. Когда процесс получает доступ к памяти,​ модуль **MMU** переводит **виртуальные адреса**,​ используемые процессом,​ в **реальные адреса** на основе таблицы страниц ядра.\\
 +
 +**Запуск и работу команды в качестве нового процесса.**
 +  - Ядро загружает начало кода с инструкциями команды в страницы памяти.
 +  - Ядро может выделить несколько страниц рабочей памяти для нового процесса.
 +  - Во время своей работы процесс может дойти до такого момента,​ когда следующей инструкции не окажется ни в одной из страниц,​ загруженных ядром изначально. Тогда ядро вступает в действие,​ загружает необходимые страницы в память и позволяет команде продолжить выполнение.
 +  - Подобным же образом,​ если команде необходимо больше рабочей памяти,​ чем было выделено изначально,​ ядро решает эту задачу,​ отыскивая свободные страницы (или освобождая пространство) и назначая их данному процессу
 +
 +==== Ошибки из-за отсутствия страниц ====
 +
 +<WRAP center round info 80%>
 +Если страница памяти не готова,​ когда процессу необходимо ее использовать,​ процесс вызывает ошибку из-за отсутствия страницы. При возникновении такого события ядро забирает у процесса управление процессором,​ чтобы подготовить страницу. Существуют два типа ошибок из-за отсутствия страниц:​ **малые** и **большие**.
 +</​WRAP>​
 +
 +**Малые ошибки**\\
 +Малая ошибка из-за отсутствия страницы возникает тогда, когда **желаемая страница фактически находится в основной памяти**,​ но модуль **MMU не знает, где она**. Такое может произойти,​ когда процесс требует больше памяти или когда модуль MMU не обладает достаточным пространством для хранения всех местоположений страниц для процесса. В таком случае ядро сообщает модулю MMU данные о странице и позволяет процессу продолжить работу. Малые ошибки из-за отсутствия страницы не столь уж существенны,​ и многие из них возникают во время работы процесса. Если вам не требуется максимальная производительность какой-либо программы,​ интенсивно обращающейся к памяти,​ вероятно,​ не стоит беспокоиться об этих ошибках.\\
 +
 +**Большие ошибки**\\
 +Большая ошибка из-за отсутствия страницы возникает тогда, когда **желаемая страница памяти не находится в основной памяти** и, значит,​ **ядро должно загрузить ее с диска или из какого-либо другого медленного хранилища данных**. Большое количество таких ошибок сильно замедлит работу системы,​ поскольку ядро должно выполнить довольно солидную работу по снабжению процессов страницами,​ лишая нормальные процессы возможности работать.
 +Некоторых больших ошибок невозможно избежать:​ например,​ когда код загружается с диска при запуске программы в первый раз. Самые серьезные проблемы возникают,​ когда памяти становится недостаточно и ядро начинает подкачивать страницы из рабочей памяти на диск, чтобы освободить место для новых страниц.\\
 +
 +**Отслеживание ошибок из-за отсутствия страниц**
 +<code bash>
 +$ /​usr/​bin/​time cal > /dev/null
 +0.00user 0.00system 0:​00.06elapsed 0%CPU (0avgtext+0avgdata 3328maxresident)k
 +648inputs+0outputs (2major+254minor)pagefaults 0swaps
 +</​code>​
 +//При работе программы произошли две большие и 254 малые ошибки из-за отсутствия страниц.//​
 +
 +<WRAP center round info 80%>
 +Если вы хотите увидеть ошибки для работающих процессов,​ воспользуйтесь командой **top** или **ps**. При запуске команды **top** используйте флаг **f**, чтобы изменить отображаемые поля, и флаг **u**, чтобы отобразить количество больших ошибок. Результаты будут показаны в новом столбце,​ **nFLT**. Количество малых ошибок вы не увидите.
 +</​WRAP>​
 +<code bash>
 +$ ps -o pid,​min_flt,​maj_flt 20365
 +PID MINFL MAJFL
 +20365 834182 23
 +</​code>​
 +//​Столбцы MINFL и MAJFL показывают число малых и больших ошибок из-за отсутствия страниц.//​
 +
 +==== Отслеживание производительности процессора и памяти с помощью команды vmstat ====
 +<code bash>
 +root@uba64:​~#​ vmstat 2
 +procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 + ​r ​ b   ​swpd ​  ​free ​  ​buff ​ cache   ​si ​  ​so ​   bi    bo   ​in ​  cs us sy id wa st
 + ​1 ​ 0   6892 234588 ​ 13464 174292 ​   0    0     ​1 ​    ​1 ​  ​11 ​  ​18 ​ 0  0 100  0  0
 + ​0 ​ 0   6892 234572 ​ 13464 174292 ​   0    0     ​0 ​    ​0 ​  ​25 ​  ​44 ​ 0  0 100  0  0
 + ​0 ​ 0   6892 234572 ​ 13464 174292 ​   0    0     ​0 ​    ​0 ​  ​29 ​  ​49 ​ 0  0 100  0  0
 + ​0 ​ 0   6892 234572 ​ 13464 174292 ​   0    0     ​0 ​    ​0 ​  ​35 ​  ​64 ​ 0  0 100  0  0
 +</​code>​
 +
 +  * procs — для процессов
 +  * memory — для использования памяти
 +  * swap — для страниц,​ которые перемещаются в область подкачки и из нее
 +  * io — для использования диска
 +  * system — для количества переключений ядра на его код
 +  * cpu — для количества времени,​ затраченного различными частями системы
 +
 +==== Отслеживание ввода/​вывода ====
 +=== Использование команды iostat ===
 +<code bash>
 +root@uba64:​~#​ iostat
 +Linux 3.19.0-25-generic (uba64) ​        ​19.01.2016 ​     _x86_64_ ​       (2 CPU)
 +
 +avg-cpu: ​ %user   %nice %system %iowait ​ %steal ​  %idle
 +           ​0,​00 ​   0,00    0,02    0,02    0,00   99,96
 +
 +Device: ​           tps    kB_read/​s ​   kB_wrtn/​s ​   kB_read ​   kB_wrtn
 +sda               ​0,​15 ​        ​3,​22 ​        ​4,​06 ​   1931243 ​   2437868
 +sdb               ​0,​00 ​        ​0,​00 ​        ​0,​00 ​      ​2341 ​        44
 +sdc               ​0,​00 ​        ​0,​01 ​        ​0,​05 ​      ​4505 ​     32837
 +sdd               ​0,​00 ​        ​0,​01 ​        ​0,​00 ​      ​5447 ​       224
 +</​code>​
 +
 +|tps|Среднее количество пересылок данных в секунду|
 +|kB_read/​s|Среднее количество считанных килобайтов в секунду|
 +|kB_wrtn/​s|Среднее количество записанных килобайтов в секунду|
 +|kB_read|Общее количество считанных килобайтов|
 +|kB_wrtn|Общее количество записанных килобайтов|
 +
 +
 +=== Отслеживание использования ввода/​вывода каждого процесса с помощью команды iotop ===
 +
 +<code bash>
 +Total DISK READ :       0.00 B/s | Total DISK WRITE :      25.78 M/s
 +Actual DISK READ:       0.00 B/s | Actual DISK WRITE: ​     41.65 M/s
 +  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN ​    ​IO> ​   COMMAND
 + 8477 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.01 % [kworker/​u4:​1]
 + 8493 be/4 root        0.00 B/s   25.78 M/s  0.00 %  0.00 % dd if=/​dev/​urandom of=/​root/​zero bs=2M count=1000
 +    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
 +    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
 +    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/​0]
 + 1028 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % sshd: titov [priv]
 +    5 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/​0:​0H]
 +    7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
 +    8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]
 +    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcuos/0]
 +</​code>​
 +
 +=== Отслеживание процессов с помощью команды pidstat ===
 +<code bash>
 +root@uba64:​~#​ pidstat -p 8479 1
 +Linux 3.19.0-25-generic (uba64) ​        ​19.01.2016 ​     _x86_64_ ​       (2 CPU)
 +
 +10:​37:​04 ​     UID       ​PID ​   %usr %system ​ %guest ​   %CPU   ​CPU ​ Command
 +10:​37:​05 ​       0      8479    1,00    0,00    0,00    1,00     ​0 ​ iotop
 +10:​37:​06 ​       0      8479    0,00    1,00    0,00    1,00     ​0 ​ iotop
 +10:​37:​07 ​       0      8479    0,00    0,00    0,00    0,00     ​0 ​ iotop
 +10:​37:​08 ​       0      8479    1,00    1,00    0,00    2,00     ​0 ​ iotop
 +10:​37:​09 ​       0      8479    0,00    0,00    0,00    0,00     ​0 ​ iotop
 +10:​37:​10 ​       0      8479    0,00    0,00    0,00    0,00     ​0 ​ iotop
 +10:​37:​11 ​       0      8479    0,00    1,00    0,00    1,00     ​0 ​ iotop
 +10:​37:​12 ​       0      8479    1,00    1,00    0,00    2,00     ​0 ​ iotop
 +10:​37:​13 ​       0      8479    0,00    0,00    0,00    0,00     ​0 ​ iotop
 +^C
 +Среднее: ​    ​0 ​     8479    0,33    0,44    0,00    0,78     ​- ​ iotop
 +</​code>​
 +
 +<WRAP center round tip 80%>
 +Хотя команда pidstat по умолчанию показывает использование процессора,​ она может намного больше этого. Например,​ можно применять параметр -r, чтобы отслеживать память,​ или параметр -d, чтобы включить отслеживание диска.
 +</​WRAP>​
 +
 +<code bash>
 +root@uba64:​~#​ pidstat -p 8479 1 -d
 +Linux 3.19.0-25-generic (uba64) ​        ​19.01.2016 ​     _x86_64_ ​       (2 CPU)
 +
 +10:​44:​03 ​     UID       ​PID ​  ​kB_rd/​s ​  ​kB_wr/​s kB_ccwr/​s ​ Command
 +10:​44:​04 ​       0      8479      0,00      0,00      0,00  iotop
 +10:​44:​05 ​       0      8479      0,00      0,00      0,00  iotop
 +10:​44:​06 ​       0      8479      0,00      0,00      0,00  iotop
 +10:​44:​07 ​       0      8479      0,00      0,00      0,00  iotop
 +10:​44:​08 ​       0      8479      0,00      0,00      0,00  iotop
 +^C
 +Среднее: ​    ​0 ​     8479      0,00      0,00      0,00  iotop
 +root@uba64:​~#​ pidstat -p 8479 1 -r
 +Linux 3.19.0-25-generic (uba64) ​        ​19.01.2016 ​     _x86_64_ ​       (2 CPU)
 +
 +10:​44:​11 ​     UID       ​PID ​ minflt/​s ​ majflt/​s ​    ​VSZ ​   RSS   ​%MEM ​ Command
 +10:​44:​12 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +10:​44:​13 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +10:​44:​14 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +10:​44:​15 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +10:​44:​16 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +10:​44:​17 ​       0      8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +^C
 +Среднее: ​    ​0 ​     8479      0,00      0,00   ​57596 ​ 14272   ​2,​85 ​ iotop
 +</​code>​
proccess_and_resurce.txt · Последние изменения: 2016/01/19 02:59 — sander