Отвалившиеся коннекты и KEEPALIVE

Администирование клиентской и серверной части InterBase, Firebird, Yaffil. Настройка файла конфигурации и т.п.

Модераторы: kdv, Alexey Kovyazin

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 25 июл 2011, 18:40

Подскажите пожалуйста есть ли еще способы (кроме настройки tcp_keepalive_time) установить время "висения" на сервере коннекта от неактивного, отвалившегося клиента?


У меня пользователи работают с базой данных через интернет. Firebird и базы находятся на виртуальном (VDS) сервере в интернете,
клиент - приложение Windows32 на машине пользователя.
В программе-клиенте используется ограничение на количество одновременных подключений. Некоторые пользователи имеют право всего на одно подключение.
В результате, если у пользователя произошел обрыв связи (а работают через модем), "коннект" на сервере зависает на 2 часа (параметр tcp_keepalive_time по умолчанию) и
пользователь не может подключится в течении этого времени. А работать то надо.

База находится на виртуальном сервере VDS OpenVZ (Linux Gentoo), чей хостинг не пишу из моральных соображений.
Изменить параметры tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes на сервере система не дает (пишет "operation not permitted"),
просил админов хостинга поменять, говорят это невозможно, переходите на другую технологию виртуализации (не OpenVZ). Но хочется остаться на OpenVZ, так как она прилично дешевле.


Подскажите может есть параметры чисто Firebird-а для такой настройки или еще какие-нибудь варианты. Как выйти из ситуации.
Или получается Firebird на OpenVZ не живет?

VDS OpenVZ
Linux Gentoo, ядро 2.6.18
Firebird 2.1.3

PS: Статью http://www.ibase.ru/devinfo/keepalive.htm читал.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 25 июл 2011, 19:57

почитать насчет параметра DummyPacketInterval в firebird.conf

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 26 июл 2011, 09:14

Читал в статье и в самом firebird.conf.
Везде пугают его использованием - "не используй".

Из firebird.conf:
# DO NOT USE THIS OPTION. It may hang or crash Windows on the client side as
# explained here: http://support.microsoft.com/default.aspx?kbid=296265
# or may not prevent eventual inactive client disconnection for other OS.


Страшно :)
Интересно его кто-нибудь вообще использует?

И вообще интересно использует ли кто-нибудь Firebird на виртуальных серверах в интеренете с доступом к нему из приложений Windows32.
Почему-то эта тема практически отсутствует в интерете, на форумах.
Неужели windows-интерфейс умер окончательно в пользу web-интерфейса...

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 26 июл 2011, 11:01

эта проблема проявляется только если машина-клиент работает сутками напролет и все это время подключена к БД и получает ежеминутные dummy-пакеты, и при этом ее краш крайне не желателен (это сервер приложений, например). Если же интервал выставлен побольше (минут 5-10) и/или если это обычная рабочая станция, которой не особо жалко нажать ресет, то проблема не столь актуальна.

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 26 июл 2011, 11:14

Спасибо за ответ.
Попробую этот параметр.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 26 июл 2011, 12:36

уточню свой пост выше - клиент не просто подключен к БД сутками напролет, а вдобавок ничего с БД не делает (не создает никакого трафика кроме серверных пингов). Т.е. 31-го декабря оставили прогу подключенной к базе до конца каникул, например :-)

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 26 июл 2011, 13:37

Честно говоря не очень понимаю в каком случае на клиенте происходит/не происходит переполнение памяти и краш.

Если программа ничего не делает? А если делает, то переполнение не происходит?

Видимо так (пока писал, вроде бы сам понял).


Но в таком случае интересно сколько может программа висеть в неактивном состоянии? (хотя из вашего поста следует, что долго). И сбросится ли накопившаяся утечка при неожиданной активизации программы?
А то вдруг какой-нибудь "слишком умный" пользователь действительно будет оставлять программу включенной постоянно, при этом периодически что-то в ней делая.

Используя дедукцию, пришел к выводу :)
Видимо накопление утечки идет постоянно, при неактивности программы она (утечка) увеличивается, при активности - стоит на месте.
Так?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 26 июл 2011, 14:21

когда клиент неактивен, то он не принимает приходящие ему серверные пинги (dummy-пакеты) и они складируются в пуле драйвера TCP-стека, который не резиновый (не уходит в своп) и может переполниться. Как только клиент что-то сделал, то все эти пакеты будут выбраны и драйвер сможет опять принимать пакеты с нуля во время следующего периода неактивности клиента. Память ядра при этом вряд ли освободится, но продолжением утечки это называть неправильно, т.к. она будет использована повторно.

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 26 июл 2011, 16:18

Вроде бы понятно :)

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

В любом случае спасибо за ответы.

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 27 июл 2011, 09:01

Вчера попробовал поменять DummyPacketInterval.
Установил в firebird.conf на сервере в 120 (2 минуты), естественно раскомментил.

Подключился клиентом, разорвал соединение (выдернул пачкорд из компа), подождал две минуты с запасом.
Подключаюсь - вижу два подключения. Оборванное не отвалилось.
(пробовал несколько раз)

:(

И смущает, что нигде не написано что после прохождения интервала DummyPacketInterval сервер закроет "висящее" соединение.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение kdv » 27 июл 2011, 12:03

у вас вроде как mediasense включено, т.е. ОС на компе не разрывает коннект при отключении провода?
для dummypacketinterval нужно еще connectiontimeout крутить. Поставьте его в 200, что-ли.

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 27 июл 2011, 19:54

Что такое mediasense, как узнать включено оно или нет?
ConnectionTimeout менять в firebird.conf на сервере или на клиенте?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение kdv » 27 июл 2011, 21:02

Что такое mediasense, как узнать включено оно или нет?
ё-мое, открываете статью про KeepAlive, жмете Ctrl-F, искомый текст.
ConnectionTimeout менять в firebird.conf на сервере или на клиенте?
вообще-то, этими штуками сервер занимается. т.е. сервер пинает клиента, а не наоборот.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 27 июл 2011, 22:25

вообще-то, ConnectionTimeout тут совсем не причем, насколько мне помнится. Это клиентский параметр и он отвечает за то, через сколько времени клиент вернет ошибку после безуспешного ожидания ответа от сервера на попытку коннекта.

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 28 июл 2011, 00:07

Почитал http://support.microsoft.com/?scid=kb%3 ... &x=13&y=14, подумал ...
Как-то это все очень мутно ... и не имеет очевидной связи с тем, что нужно.

Думаю, придется заюзать другой сервер, возможно Xen технологию или FreeBSD и поменять net.ipv4.tcp_keepalive_time.
Жаль что OpenVZ не может этого делать (всего-то надо было).

Всем спасибо.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение hvlad » 28 июл 2011, 00:45

michaelr писал(а):Вчера попробовал поменять DummyPacketInterval.
Установил в firebird.conf на сервере в 120 (2 минуты), естественно раскомментил.
Firebird перезапустил ?

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 28 июл 2011, 08:18

hvlad писал(а):Firebird перезапустил ?
Да, всю VDS перезагрузил.

Заметил другое. Если в программе работать, то через некоторое время вылетает сообщение типа "сервер прервал связь....".
Вроде бы это происходит как раз минуты через 2 если в программе ничего не делать. О как.

Но мне такой эффект не нужен :)
Нужно несколько иное - чтобы отвалившиеся клиенты (по причине обрыва связи; модем например), точнее их коннекты на сервере через пару минут "убивались".

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 28 июл 2011, 08:41

Раз уж пошла такая пьянка... вот мой проект www.rm-sklad.ru
Вдруг кому интересно.
(раскрою свое инкогнито, да и реклама заодно, если не удалит модератор :) )

Интересно делает кто-нибудь что-то подобное сейчас. В частности по связи через инет.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение dimitr » 28 июл 2011, 10:40

попробуй обновиться на 2.1.4

michaelr
Сообщения: 11
Зарегистрирован: 24 июл 2011, 23:47

Re: Отвалившиеся коннекты и KEEPALIVE

Сообщение michaelr » 28 июл 2011, 17:50

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

Думаю, придется попробовать под xen-ом.

Ответить