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

TCP вне памяти

Я запускаю один экземпляр gcloud g1-small с Debian для работы одного сервера Node и одного сервера Apache. Я использую Node Bouncy для перенаправления HTTP-запросов на Node или Apache в зависимости от req.headers.host. Каждый из двух моих веб-сайтов имеет низкий трафик, менее 10 тысяч обращений в день.

Примерно через две недели непрерывной работы мои веб-сайты Apache и Node перестали отвечать. Мне тоже не удалось подключиться к экземпляру через SSH. После перезагрузки и просмотра логов я обнаружил следующее:

/var/log/kern.log:
kernel: [timestamp] TCP: out of memory -- consider tuning tcp_mem
(multiple times)

/var/log/apache2/error.log:
[Timestamp] [core:warn] [pid 573] (105)No buffer space available: AH00056: connect to listener on 0.0.0.0:8001
(multiple times)

В моем файле журнала узла ничего не было.

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

Недавно мы столкнулись с интересной производственной проблемой. Это приложение работало на нескольких экземплярах AWS EC2 за Elastic Load Balancer. Приложение работало на ОС GNU / Linux, Java 8, сервер приложений Tomcat 8. Внезапно один из экземпляров приложения перестал отвечать. Все остальные экземпляры приложений обрабатывали трафик должным образом. Всякий раз, когда HTTP-запрос отправлялся этому экземпляру приложения из браузера, мы получали следующий ответ, который нужно было распечатать в браузере.

Ошибка прокси

Прокси-сервер получил недопустимый ответ от вышестоящего сервера. Прокси-сервер не смог обработать запрос GET /.

Причина: ошибка чтения с удаленного сервера

Давайте посмотрим, как мы решили эту проблему, назначив значения для этих свойств на сервере:

net.core.netdev_max_backlog = 30000 net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_rmem = 4096 87380 67108864c108864t.ip_w4 net.ip_w4

TCP: недостаточно памяти - рассмотрите возможность настройки tcp_mem

Я увеличил некоторые значения TCP, чтобы использовать больше памяти. Я добавил эти строки в сценарий запуска сервера:

sysctl -w net.ipv4.tcp_mem='116730 155640 233460'
sysctl -w net.ipv4.tcp_max_orphans='24576'

Хотя это не должно решить проблему навсегда, это должно дать мне больше времени безотказной работы до того, как сервер выйдет из строя. Перезагружал сервер раз в месяц и пока никаких проблем не было.

Однако реальным решением было бы исправить утечку памяти, которая в первую очередь вызывает эту проблему.