Назад | Перейти на главную страницу

3 разных метода подсчета количества переключений контекста для конкретной рабочей нагрузки дают 2 разных ответа

У меня есть система 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 больше единицы. Конечно, для рабочих нагрузок, связанных с процессором. Медленное хранение означает вечность ожидания процессора.