У нас есть несколько производственных систем, которые недавно были преобразованы в виртуальные машины. Существует наше приложение, которое часто обращается к базе данных MySQL, и для каждого запроса оно создает соединение, запрашивает и отключает это соединение.
Это не подходящий способ запроса (я знаю), но у нас есть ограничения, которые мы не можем обойти. В любом случае, проблема заключается в следующем: хотя машина была физическим хостом, программа работала нормально. После преобразования в виртуальную машину мы заметили периодические проблемы с подключением к базе данных. В какой-то момент было 24000+ сокетных подключений в TIME_WAIT (на физическом хосте максимум, что я видел, было 17000 - не хорошо, но не вызывало проблем).
Я хотел бы, чтобы эти соединения использовались повторно, чтобы мы не увидели проблему с подключением, и так:
Вопросов:
Можно ли установить значение tcp_tw_reuse равным 1? Каковы очевидные опасности? Есть ли причина, по которой я никогда не должен это делать?
Кроме того, есть ли другой способ заставить систему (RHEL / CentOS) предотвратить попадание такого количества соединений в TIME_WAIT или получить их для повторного использования?
Наконец, что будет делать изменение tcp_tw_recycle, и поможет ли это мне?
Заранее спасибо!
Ответы:
Вы можете безопасно сократить время простоя, но у вас могут возникнуть проблемы с неправильно закрытыми соединениями в сетях с потерей пакетов или дрожанием. Я не стал бы настраивать с 1 секунды, начинал с 15-30 и продолжал свой путь вниз.
Кроме того, вам действительно нужно исправить ваше приложение.
RFC 1185 имеет хорошее объяснение в разделе 3.2:
источник
Это не отвечает на ваш вопрос (и он опаздывает на 18 месяцев), но предлагает другой способ заставить ваши старые приложения повторно использовать порты:
Полезной альтернативой настройке
tcp_tw_reuse
(илиtcp_tw_recycle
) в системе является вставка общей библиотеки (использованиеLD_PRELOAD
) в ваше приложение; эта библиотека может затем разрешить повторное использование порта. Это позволяет вашему устаревшему приложению разрешать повторное использование порта, не применяя его ко всем приложениям в вашей системе (никаких изменений в вашем приложении не требуется), тем самым ограничивая влияние вашей настройки. Например,Эта общая библиотека должна перехватывать
socket()
вызов, вызывать реальный socket () и устанавливать SO_REUSEADDR и / или SO_REUSEPORT в возвращаемом сокете. Посмотрите на http://libkeepalive.sourceforge.net пример того, как это сделать (это включает keepalive, но включение SO_REUSEPORT очень похоже). Если ваше устаревшее приложение с плохим поведением использует IPv6, не забудьте изменить строку 55libkeepalive.c
изв
Если вы застряли, пришлите мне письмо, и я напишу код и отправлю его вам.
источник
Я думаю, что можно изменить это значение на 1. Более подходящим способом может быть использование команды:
Я не знаю очевидных опасностей, но быстрый поиск в Google выдает эту ссылку, которая подтверждает, что
tcp_tw_reuse
это лучшая альтернативаtcp_tw_recycle
, но ее следует использовать с осторожностью.источник
Соединение не может быть повторно использовано, если они находятся в режиме ожидания. Если у вас нет потери пакетов в сети между приложением и MySQL, вы можете уменьшить время ожидания.
Однако лучшее решение - использовать постоянные соединения с базой данных и пул соединений.
источник