Вопрос или проблема
Я использую htop
, чтобы видеть запущенные процессы. Я заметил, что на ядре 68, где я запускаю свою программу на c++, использование ЦП на уровне 60% отображается красным, т.е. используется ядром. Обычно мой процесс занимает 60-90% ЦП, и это вызывало его голодание, что приводило к накоплению данных в очереди и использованию 20 ГБ ОЗУ (и это количество растет).
- Я пытаюсь понять, почему, если это выполнялось на изолированном ядре, ядро также работало там?
- Существует ли способ проверить, какой процесс ядра работал там?
- Поскольку моё приложение выполняет операции ввода-вывода, там есть системные вызовы, может ли это быть причиной? Оно в основном слушает входящие данные с помощью TCP и снова отправляет их в базу данных, также используя TCP, и ведется немного журналирования (но не много, несколько МБ за 5-6 часов).
.
Ответ или решение
Ответ на вопрос о том, почему процесс ядра выполняется на изолированном ядре, требует понимания нескольких ключевых аспектов операционных систем, управления процессами и архитектуры многоядерных систем.
1. Причины выполнения процессов ядра на изолированном ядре
Ваша ситуация, когда вы наблюдаете высокую загрузку ЦП на изолированном ядре, может быть следствием нескольких причин:
-
Изоляция ядер: Изолированные ядра часто используются для повышения производительности высокопроизводительных приложений. Однако даже на изолированном ядре могут выполняться задачи, относящиеся к ядру, такие как обработка прерываний или выполнение системных вызовов. Это связано с тем, что приложения часто взаимодействуют с хранилищами или пользователями через системные вызовы, что неизбежно вызывает обработку в контексте ядра.
-
Планировщик процессов: Операционные системы используют планировщики для управления тем, какой процесс или поток выполняется на каждом ядре. Если ваше приложение активно выполняет I/O операции (например, через TCP), это может инициировать системные вызовы, которые требуют обработки ядром. Даже если ваше приложение запущено на изолированном ядре, системные вызовы, такие как
read
,write
, илиselect
, будут обслуживаться ядром, что может приводить к тому, что процессы ядра занимают заметное количество ресурсов ЦП.
2. Как проверить, какие процессы ядра выполняются на конкретном ядре
Для диагностики процессов ядра на конкретном ядре вы можете воспользоваться следующими инструментами и командами:
-
htop
илиtop
: Эти инструменты позволяют визуально отслеживать загрузку процессоров. Вhtop
вы можете настроить фильтры для отображения процессов ядра и посмотреть, какие системные вызовы активны. -
pidstat
: Эта утилита из пакетаsysstat
может предоставить детальную информацию о том, сколько времени CPU затрачивается на пользовательские и системные процессы. Это поможет вам определить, какие системные процессы вызывают высокую загрузку CPU. -
perf
: Этот инструмент может использоваться для анализа производительности вашего приложения и выявления узких мест, связанных с процессами ядра.
3. Влияние I/O операций на нагрузку на ядро
Ваша программа, которая активно использует сетевые операции, вероятнее всего, вызывает значительное количество системных вызовов. При каждом запросе TCP ваше приложение переходит в режим ядра, что может привести к увеличенной нагрузке на процессор:
-
Системные вызовы: Ваше приложение, вероятно, выполняет множество вызовов операций чтения и записи, что приводит к увеличению контекстного переключения в ядре. Каждый такой системный вызов может занимать больше времени, если ваша программа генерирует большое количество данных или работает с медленными I/O устройствами.
-
Логирование: Даже небольшие объемы логирования могут накапливаться, особенно если логирование выполняется синхронно. Рассмотрите возможность асинхронного логирования или пакетирования операций.
Заключение
Таким образом, наличие процессов ядра на изолированном ядре связано с системными вызовами, генерируемыми вашим приложением, а также с работой планировщика потоков. Для более глубокого анализа рекомендуется использовать инструменты мониторинга, чтобы определить, какие именно системные вызовы увеличивают нагрузку. Попробуйте оптимизировать обработку I/O и уменьшить количество вызовов в контексте ядра для более эффективного использования ресурсов.