| Предыдущий | Следующий |
| MACH_SEND_INVALID_MEMORY | MACH_SEND_TOO_LARGE |
MACH_SEND_NO_BUFFER
Нехватка ресурсов IPC ядра
MACH_SEND_NO_BUFFER является результатом нехватки ресурсов: ядро не смогло выделить буфер сообщения, необходимый для начала отправки. Это отличается от переполнения очереди назначения. Проблема ёмкости очереди обычно приводит к ожиданию или MACH_SEND_TIMED_OUT, если включён тайм-аут; данный код означает, что в этот момент ядро не смогло получить внутренний ресурс IPC.
Документированная классификация отправки указывает, что при таком результате вызов ничего не выполнил. Поэтому повтор возможен, но должен быть ограничен. Плотный цикл повторов может усилить давление на память и скрыть нагрузку, которая его создала. Зафиксируйте более широкий контекст процесса и системы, прежде чем считать это единичным временным состоянием.
Практические действия
- Применяйте увеличивающуюся задержку и ограниченное число повторов для идемпотентной работы.
- Запишите размер сообщения, число дескрипторов, скорость производителя и одновременную нагрузку IPC.
- Исследуйте давление на память, необычно крупные сложные сообщения и неограниченные очереди производителей.
- Используйте сброс нагрузки или пакетную обработку на уровне приложения, когда получатель не успевает обрабатывать поток.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Руководство Apple по программированию ядра: обзор Mach
- Исходный код Apple XNU: реализация mach_msg
Нужно найти другой код? Найти другой код состояния или ошибки.