У меня есть система Centos7 на облачной машине Google, на которой запущен многопоточный сервер базы данных, который выполняет определенный набор запросов за 70 секунд (плюс-минус 1 секунда). Я хочу знать, сколько переключений контекста выполняет сервер при выполнении этой рабочей нагрузки.
Идентификатор сервера - 11850.
Я использовал 3 разных метода подсчета:
способ 1:
Начало
perf -e context-switches -p 11850
в одном окне и сразу же запустить клиент базы данных в другом окне. Затем убейте perf, как только клиент завершит работу.
В результате получается
Performance counter stats for process id '11850':
5,831,206 context-switches # 0.004 M/sec
70.607962486 seconds time elapsed
Способ 2
Начало
pidstat -tw -p 11850 70 1 >pidstat.out
в одном окне и сразу запустить клиент в другом окне.
И pidstat, и клиент завершатся в течение секунды друг за друга. Когда это произойдет, сложите все значения cswch / s и nvcswch / s в pidstat.out и умножьте результат на 70.
Это дает почти тот же результат, что и метод 1.
Способ 3
Запустите сценарий, содержащий следующие команды в одном окне
vmstat -s|grep "CPU context switches"
sleep 70
vmstat -s|grep "CPU context switches"
а затем сразу же запустить клиент в другом окне. И клиент, и второй vmstat завершат работу в течение секунды.
Выходы vmstat:
439394923 CPU context switches
450457926 CPU context switches
Вычитание первого числа из второго дает 11 063 003, что почти вдвое превышает результат двух других методов.
Поскольку в системе больше ничего не выполнялось, а нормальная скорость переключения контекста в бездействующей системе составляет около 100 в секунду, похоже, что метод vmstat - это двойной подсчет переключений контекста.
Это ошибка или я что-то упускаю?
Предположение, что только проверенный PID выполняет переключение контекста, требует изучения.
Проверьте переключение контекста на всех процессорах, например, с perf top -e context-switches -a
. Возможно, вы увидите, что другие задачи, включая другие потоки базы данных и вещи ядра, переходят и выключаются из процессора.
Более полезным, чем просто счетчик переключения контекста, было бы статистика как инструкции за цикл. Получите те с perf stat
. Хороший IPC больше единицы. Конечно, для рабочих нагрузок, связанных с процессором. Медленное хранение означает вечность ожидания процессора.