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

Сколько переключений контекста является «нормальным» (в зависимости от ядер ЦП (или других))?

Привет, повелители Linux / UNIX,

Есть ли у кого-нибудь из вас эмпирическое правило относительно того, сколько переключателей контекста (на ядро ​​процессора) Нормальный на сервере Linux?

Мой колледж здесь поднял это, и он видит 16K на 8-ядерном x86_64 машина.

Вот некоторая статистика с sarface за последние несколько дней ...

альтернативный текст http://src.autonomy.net.au/imagebin/81895e338fae67d3d205c09db44a81e6-Picture_10.png

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

альтернативный текст http://src.autonomy.net.au/imagebin/7481f7e52bead4effc90248fc23c72fe-Picture_11.png

А 8 ядер до смерти надоели ...

альтернативный текст http://src.autonomy.net.au/imagebin/0e94326652e977fd74edcd840f94200f-Picture_12.png

CS против IOwait (масштаб x10000)

альтернативный текст http://src.autonomy.net.au/imagebin/a52a2a8a120394849c0da4045933e306-Picture_13.png

Больше бесполезной информации, если кто-нибудь спросит ...

Это во многом зависит от типа запускаемого вами приложения. Если у вас есть приложения, которые очень часто запускают системные вызовы WRT, вы можете ожидать большого количества переключений контекста. Если большинство ваших приложений бездействуют и просыпаются только тогда, когда в сокете что-то происходит, вы можете ожидать увидеть низкие скорости переключения контекста.

Системные вызовы

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

Когда мы смотрим на определение системного вызова write (2) из ​​Linux, это становится очень ясным:

NAME
       write - write to a file descriptor

SYNOPSIS
       #include 

       ssize_t write(int fd, const void *buf, size_t count);

DESCRIPTION
       write() writes up to count bytes from the buffer pointed buf to the file
       referred to by the file descriptor fd. [..]

RETURN VALUE
       On success, the  number of bytes written is returned (zero indicates
       nothing was written). On error, -1 is returned, and errno is set
       appropriately.
       [..]

По сути, это говорит ядру взять на себя операцию от процесса, перейти к count байтов, начиная с адреса памяти, на который указывает *buf в файловый дескриптор fd текущего процесса, а затем вернитесь к процессу и расскажите ему, как все прошло.

Хороший пример, показывающий, что это выделенный игровой сервер для игр на основе Valve Source, hlds. http://nopaste.narf.at/f1b22dbc9 показывает системные вызовы за одну секунду, выполненные одним экземпляром игрового сервера, на котором не было игроков. Этот процесс занимает около 3% процессорного времени на Xeon X3220 (2,4 ГГц), просто чтобы вы почувствовали, насколько это дорого.

Многозадачность

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

Хороший способ визуализировать это - cpuburn. cpuburn сам по себе не выполняет никаких системных вызовов, он просто выполняет итерацию по собственной памяти, поэтому не должно вызывать переключения контекста.

Возьмите простаивающую машину, запустите vmstat, а затем запустите burnMMX (или любой другой тест из пакета cpuburn) для каждого ядра процессора в системе. К тому времени у вас должна быть полная загрузка системы, но вряд ли повышенное переключение контекста. Затем попробуйте запустить еще несколько процессов. Вы увидите, что скорость переключения контекста увеличивается по мере того, как процессы начинают конкурировать за ядра ЦП. Количество переключений зависит от соотношения процессов / ядра и разрешения многозадачности вашего ядра.

дальнейшее чтение

На linfo.org есть хорошая статья о том, что переключатели контекста и системные вызовы являются. Википедия имеет общую информацию и красивую коллекцию ссылок на системные вызовы.

мой умеренно загруженный веб-сервер большую часть времени находится на уровне 100–150 переключений в секунду с пиками до тысяч.

Высокая скорость переключения контекста сама по себе не является проблемой, но может указать путь к более серьезной проблеме.

изменить: переключение контекста - это симптом, а не причина. Что вы пытаетесь запустить на сервере? Если у вас многопроцессорный компьютер, вы можете попробовать установить привязку процессора для процессов основного сервера.

В качестве альтернативы, если вы используете X, попробуйте перейти в режим консоли.

отредактируйте еще раз: при 16k cs в секунду каждый процессор в среднем выполняет два переключения в миллисекунду - это от половины до шестой обычного временного интервала. Может ли он запускать много потоков, связанных с вводом-выводом?

отредактируйте еще раз постовые графики: Конечно, похоже, что ввод-вывод связан. тратит ли система большую часть своего времени в SYS, когда переключение контекста высокое?

отредактируйте еще раз: высокий iowait и система на этом последнем графике - полностью затмевают пространство пользователя. У вас проблемы с вводом-выводом.
Какую карту FC вы используете?

редактировать: хммм. есть ли шанс получить какие-то тесты при доступе к SAN с помощью bonnie ++ или dbench в мертвое время? Мне было бы интересно узнать, есть ли у них аналогичные результаты.

edit: Я думал об этом на выходных, и я видел похожие шаблоны использования, когда Бонни выполняет проход «записывать по байту за раз». Это может объяснить большое количество переключений, так как для каждой записи потребуется отдельный системный вызов.

Я больше склонен беспокоиться о загруженности процессора состоянием системы. Если оно близко к 10% или выше, это означает, что ваша операционная система тратит слишком много времени на переключение контекста. много медленнее, он заслуживает этого.

Вот почему вы должны стараться поддерживать базовые показатели производительности для своих серверов. Таким образом, вы можете сравнивать то, что внезапно замечаете, с тем, что вы записали в прошлом.

Тем не менее, у меня есть работающие серверы (в основном не очень загруженные серверы Oracle), которые стабильны около 2k с некоторыми пиками 4k. Для моих серверов это нормально, для серверов других людей они могут быть слишком низкими или слишком высокими.

Как далеко вы можете вернуться к своим данным?

Какую информацию о процессоре вы можете нам предоставить?

Нет никакого практического правила. Переключение контекста - это просто переход ЦП от обработки одного потока к другому. Если вы запустите много процессов (или несколько многопоточных), вы увидите больше переключателей. К счастью, вам не нужно беспокоиться о том, сколько существует переключателей контекста - затраты невелики и более или менее неизбежны.