Skip to content

Планировщик ОС: поиск баланса

Необходимо найти баланс между количеством имеющихся ядер и количеством потоков, необходимых для получения наилучшей пропускной способности твоего приложения. Когда дело доходит до управления этим балансом, пулы потоков являются отличным ответом. В Go больше нет необходимости использовать пулы. Это одна из полезных возможностей, которые в Go реализовали для упрощения разработки многопоточных приложений.

Рассмотрим, как обстоят дела в C++ и C# для NT. В этой операционной системе использование пулов потоков IOCP (порты завершения ввода-вывода) было критически важным для написания многопоточного программного обеспечения. Как инженер, ты должен был выяснить, сколько пулов потоков тебе нужно, и максимальное количество потоков для любого заданного пула, чтобы максимизировать пропускную способность для количества ядер, которое тебе дали.

При написании веб-сервисов, взаимодействующих с базой данных, магическое число 3 потока на ядро, казалось, всегда давало наилучшую пропускную способность в NT. Три потока на ядро сводили к минимуму затраты на задержку переключения контекста и максимально увеличивали время выполнения на ядрах. При создании пула потоков IOCP нужно начинать как минимум с первого потока и максимум с тремя потоками для каждого ядра, которые мы идентифицировали на хост-компьютере.

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

Что делать, если сервис выполняет много разных видов работы? Это может создать разные и непоследовательные задержки. Возможно, это также создает множество различных событий системного уровня, которые необходимо обрабатывать. Может оказаться невозможным найти магическое число, которое работает все время для всех различных рабочих нагрузок. Когда дело доходит до использования пулов потоков для настройки производительности службы, может быть очень сложно найти правильную согласованную конфигурацию.