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

Как устранить проблемы с сокетами домена unix?

Сервер Ubuntu 10.04.2

$ uname -a
Linux my.local 2.6.32-30-generic-pae #59-Ubuntu SMP 
Tue Mar 1 23:01:33 UTC 2011 i686 GNU/Linux

Кажется, что очередь сокетов моего домена переполнена, но я не могу этого доказать.

У меня есть этот стек nginx->[spawn-fcgi->multiwatch->]custom-fcgi-service

Nginx общается с custom-fcgi-service с помощью сокета домена unix.

Сегодня у нас небольшой рост трафика, и вдруг мой nginx error.log полно угрей:

2011/04/07 15:31:51 [error] 28187#0: *469350 connect() to unix:/tmp/my.socket 
failed (11: Resource temporarily unavailable) while connecting to upstream, 
client: [IP witheld], server: my.local, request: "GET /myurl HTTP/1.0", 
upstream: "fastcgi://unix:/tmp/my.socket:", host: "example.com"

Некоторые запросы проходят, но многие возвращают ошибку 5xx.

Если я перезапущу custom-fcgi-service, ошибка исчезнет, ​​но вскоре появится снова. После осмотра custom-fcgi-service status, я достаточно уверен, что он работает нормально (хотя может быть слишком медленным для такого объема трафика, но это всего лишь гипотеза).

Я пробовал это делать:

echo 65535 > /proc/sys/net/unix/max_dgram_qlen

Но это не сильно помогло. (Не уверен, увеличилось ли время до ошибки, может быть, но этого недостаточно, чтобы исправить это.)

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

Вопрос: как отладить эту проблему? И если это действительно длина очереди сокетов, как сделать датчик, который предупредит нас, что нам нужно разветвлять больше? custom-fcgi-service рабочие?

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

echo "2000" > /proc/sys/net/core/netdev_max_backlog

или

sysctl –w sys.net.core.netdev_max_backlog=2000

Вы проверяли системные журналы (например, dmesg)?

попробуйте изменить файл конфигурации спауна, невыполнение: 4096.