syscall recvmsg() периодически зависает

Это также может быть связано с проблемой DNS-сервера BIND9. Я обнаружил, что иногда количество запросов в секунду к серверу внезапно становится равным 0, а затем это длится несколько секунд, обычно более 10 секунд. Тем не менее, количество входящих запросов DNS-запросов никогда не опускается ниже 500 в секунду.

Я добавил несколько журналов отладки в BIND9 src и снова запустился, затем заметил, что поток будет ждать несколько секунд, прежде чем recvmsg() будет периодически возвращаться. Пока он зависает, Recv-Q становится полным. Версия BIND-9.9.6, но, к сожалению, когда я переключаюсь на BIND- 9.9.9-P4, проблема все еще остается.

Затем я попробовал другой DNS-сервер, написанный на Golang, и заметил, что проблема не возникла. Частота запросов остается стабильной, как и должно быть.

Я думаю, что функция ReadFromUDP() Golang, которую использовал этот сервер, просто оборачивает syscall recvfrom(), и recvfrom () там тоже не блокируется. Но ReadFromUDP(), кажется, продолжает пытаться использовать recvfrom (), в то время как BIND9 использует epoll. Когда данные успешно прочитаны, ReadFromUDP() вернется. Я не уверен, есть ли какая-то разница между этими двумя случаями.

Я использую CentOs 6.4, а версия ядра - 2.6.32-358-el6.x86_64.

Кто-нибудь когда-нибудь сталкивался с такой проблемой?

0 ответов

Другие вопросы по тегам