powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Многопоточная нагрузка сервера - timeout exceeded exception
25 сообщений из 51, страница 1 из 3
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313842
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Возникла такая штуковина. Есть сервер Firebird, есть прога, которая создает кучу коннектов к нему (порядка 200), используется дотнетовая FirebirdSql.Data.FirebirdClient.dll. Каждый коннект - в своем потоке, делает различные запросы (имитируется работа этих самых 200 человек). В процессе работы каждого "человека" (т.е. потока) возможны действия:
1. Подключение/отключение к БД.
3. Старт/откат/коммит транзакции.
5. Запрос.

На небольшом числе коннектов все работает нормально - пришлось только увеличить на сервере лимит подключений с одного ip (иначе после 30 коннектов выдавалось "reject connection"). Но теперь другая проблема: спустя пару минут работы выдается исключение timeout exceeded. Удалось установить, что явной зависимости от числа коннектов - нет. Если запустить 200 - то ошибка просто возникнет быстрее, чем на 150.

На всякий случай, привожу код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
class FBClient : IDisposable
{
    FbConnection    fbConnection;
    FbTransaction   fbTransaction;
    string          fbConString;

    public FBClient(string conString)
    {
        fbConString = conString;
    }

    public void Dispose()
    {
        fbConnection.Dispose();
    }

    public void Open()
    {
        fbConnection = new FbConnection(fbConString);
        fbConnection.Open();
    }

    public void Close()
    {
        fbConnection.Close();
        fbConnection.Dispose();
    }

    public void TransactionBegin()
    {
        fbTransaction = fbConnection.BeginTransaction();
    }

    public void TransactionCommit()
    {
        fbTransaction.Commit();
    }

    public void TransactionRollback()
    {
        fbTransaction.Rollback();
    }

    public void ExecuteQuery(string commandStr, List<string> parameters, bool isQuery)
    {
        using (FbCommand cmd = new FbCommand(commandStr, fbConnection, fbTransaction))
        {
            for(int i=0; i<parameters.Count; i++)
            {
                if (parameters[i] == "<NULL>")
                {
                    cmd.Parameters.Add(string.Format("@param{0}", i), null);
                }
                else
                {
                    cmd.Parameters.Add(string.Format("@param{0}", i), parameters[i]);
                }
            }

            if (isQuery)
            {
                var reader = cmd.ExecuteReader();
            }
            else
            {
                cmd.ExecuteNonQuery();
            }
        }
    }
}


Пробовал и по-другому: писать fbConnection = new FbConnection(fbConString); в конструкторе, fbConnection.Dispose(); только в public void Dispose() - эффект такой же.

Буду очень признателен за помощь!
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313867
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнение: заметил, что если запустить одно приложение и 100 коннектов - то валится эксепшен, но если 2 экземпляра приложения по 50 коннектов - то не валится.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313871
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceпришлось только увеличить на сервере лимит подключений с одного ip
это как?
TopSpaceУдалось установить, что явной зависимости от числа коннектов - нет. Если запустить 200 - то ошибка просто возникнет быстрее, чем на 150.
Classic, SuperServer? Код ошибки в коде обрабатывается? В какой именно момент ошибка проявляется? Памяти сколько все это жрет, в виртуал ничего не вываливается? Тредов столько же сколько коннектов?
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313877
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvTopSpaceпришлось только увеличить на сервере лимит подключений с одного ip
это как?

Я точно не знаю, это админы настраивали. Есть некие настройки сервера Firebird 2.5, в том числе - лимит подключений с одного ip (по умолчанию 30).

kdvTopSpaceУдалось установить, что явной зависимости от числа коннектов - нет. Если запустить 200 - то ошибка просто возникнет быстрее, чем на 150.
Classic, SuperServer? Код ошибки в коде обрабатывается? В какой именно момент ошибка проявляется? Памяти сколько все это жрет, в виртуал ничего не вываливается? Тредов столько же сколько коннектов?

Увы, я в БД слабо разбираюсь, может быть ответ на вопрос Classic/SuperServer можно найти из того, как формируется connection string?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        public static string BuildConnectionString(string server, string db, string user, string psw)
        {
            FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
            cs.DataSource   = server;
            cs.Database     = db;
            cs.UserID       = user;
            cs.Password     = psw;
            cs.Charset      = "win1251";
            return cs.ToString();
        }

Ошибка, как я понимаю, проявляется при fbConnection.Open(); - бросается исключение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        public void Open()
        {
            if (isOpen) return;
            try
            {
                fbConnection = new FbConnection(fbConString);
                fbConnection.Open();
                isOpen = true;
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Прога отъедает всего-то метров 20 оперативы. Да, каждый коннект - отдельный тред.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313884
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceЕсть некие настройки сервера Firebird 2.5, в том числе - лимит подключений с одного ip (по умолчанию 30).
то есть, на сервере линукс?

TopSpaceУвы, я в БД слабо разбираюсь, может быть ответ на вопрос Classic/SuperServer можно найти из того
круто. работаете с сервером, и не знаете, что это такое. Из строки коннекта, разумеется, нельзя понять архитектуру сервера.
Да и вы строку коннекта и не указали. По ней разве операционную систему сервера можно определить.

TopSpaceОшибка, как я понимаю, проявляется при fbConnection.Open(); - бросается исключение:
нужно еще смотреть логи на сервере. И вообще, как там сервер. Как я понимаю, это не ваша задача? Тупик, однако.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313888
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Firebird нет исключения с текстом "timeout exceeded". Так что либо ты его неправильно
переписал, либо это проблема в .NET провайдере.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313889
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvэто как?
Linux Classic.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313891
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvто есть, на сервере линукс?


Да, вроде там centos.


kdvкруто. работаете с сервером, и не знаете, что это такое. Из строки коннекта, разумеется, нельзя понять архитектуру сервера.
Да и вы строку коннекта и не указали. По ней разве операционную систему сервера можно определить.


Да, приходится на ходу разбираться с совершенно незнакомой областью программирования)

kdvнужно еще смотреть логи на сервере. И вообще, как там сервер. Как я понимаю, это не ваша задача? Тупик, однако.


Логи посмотрим конечно, но в целом можно ли сказать, отчего вообще бывает такой эксепшен?
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313895
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а фиг знает. вдруг там классик, а на сервере памяти не хватает, все выпадает в виртуал, и таймауты возникают. Как пример. Или в операционке что-то. И т.д.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313903
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

кстати, у формирователя connectionString есть любопытные параметры:

cs.ServerType = FbServerType.Embedded;
cs.ClientLibrary = ...

В зависимости от того, что указано в первом, требуется или не требуется fbclient.dll во втором (сейчас у меня все работает без нее) - может это имеет значение?

Плюс вот такие говорящие названия, может имеет смысл ими поиграться?
cs.ConnectionTimeout
cs.IsolationLevel
cs.Pooling
cs.MaxPoolSize
cs.ConnectionLifeTime
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313910
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

ну да, исключение выдает .net provider, просто непонятно куда копать, чтобы понять причину) Т.е. какой тип/настройки сервера наиболее тут уместны.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313913
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceкстати, у формирователя connectionString есть любопытные параметры:
cs.ServerType = FbServerType.Embedded;
нельзя работать с сервером, не имея о нем никакого представления. читайте faq
http://www.ibase.ru/ibfaq.htm#embedded
у вас никакой не embedded, и опять вы не в состоянии привести строку коннекта.

TopSpaceможет это имеет значение?
см. выше.

TopSpaceПлюс вот такие говорящие названия, может имеет смысл ими поиграться?
может быть. ничего не могу сказать, меня .Net не интересует абсолютно.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceпросто непонятно куда копать, чтобы понять причину
Провайдер идёт с исходниками. Лезь в них, ищи место где это исключение выбрасывается,
смотри почему.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313919
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще, чтоб не создавать отдельной темы вопрос:

если провести 2 раза идентичные нагрузочные испытания, т.е. 10 минут слать на сервер запросы, потом тест повторить (восстановив перед этим из бэкапа ту же базу, на всякий случай) - совпадут ли графики в Zabbix? И вообще, как можно оценить по Zabbix'у, справляется ли сервер с запросами?
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313923
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за советы, почитаю, и гляну в исходники (судя по стек трейсу - что-то в ConnectionPool).

Но и предварительные результаты интересны, выставил такие настройки коннекта:
cs.ConnectionTimeout = 10000000;
cs.IsolationLevel = System.Data.IsolationLevel.ReadCommitted;
cs.MaxPoolSize = 1000000;
cs.ConnectionLifeTime = 100000;

На всякий случай с запасом) Прога стреляет запросы на 200 человек уже 10 минут - пока не падает, уже прогресс))
Ощущение такое, что все дело в этом самом timeout, но без знания матчасти не могу пока сообразить что именно.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313929
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- по параметрам должна быть справка.
- с .net тут мало кто работает, да и слово zabbix за всю жизнь этого раздела ни разу не упоминалось
- восстановление из бэкапа не должно влиять на результат (разве что в самых запущенных случаях)
- справляется-ли сервер с запросами - нужно смотреть на сервере. Если для вас он черный ящик, то вы не поймете причину таймаутов по коннектам. Могут быть банальные глюки сети на стыке Windows-Linux.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313966
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpacecs.IsolationLevel = System.Data.IsolationLevel. ReadCommitted ;
Плохой выбор.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37313969
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DSПлохой выбор.
кстати, да, если в драйвере так этот косяк и не исправили.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314453
metaclass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvDSПлохой выбор.
кстати, да, если в драйвере так этот косяк и не исправили.

А что там за косяк с ReadCommited?
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314455
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metaclassА что там за косяк с ReadCommited?
а он с no_rec_version. автор драйвера не соображает, хотя ему неоднократно не только намекали, но и писали в трекер
http://tracker.firebirdsql.org/browse/DNET-337
В результате до сих пор правильным является ReadUncommitted, а неправильным - ReadCommitted.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314456
metaclass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvDSПлохой выбор.
кстати, да, если в драйвере так этот косяк и не исправили.

если это про no record version - то таки не исправили:
Код: plaintext
1.
2.
3.
4.
5.
                case IsolationLevel.ReadCommitted:
                default:
                    options.TransactionBehavior |= FbTransactionBehavior.ReadCommitted;
                    options.TransactionBehavior |= FbTransactionBehavior.NoRecVersion;
                    break;

в результате для ReadCommitted получается write wait read_commited no_rec_version
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314460
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага. и получается маразм - кто напарывается, жалуется на ФБ. или не жалуется, а молча забивает. И так оно неисправлено висит уже несколько лет, если не ошибаюсь.
В ODBC тоже был аналогичный загиб, но его исправили недавно.
Вывод - драйверописатели .Net и ODBC не работают с FB.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314539
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел в исходниках .net provider это место, где выдается исключение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
		private void CheckMaxPoolSize()
		{
			lock (this.syncObject)
			{
				if (this.options.MaxPoolSize > 0 &&
					(this.Count + 1) >= this.options.MaxPoolSize)
				{
					long timeout = this.options.ConnectionTimeout * TimeSpan.TicksPerSecond;
					long start = DateTime.Now.Ticks;

					while (true)
					{
						if ((this.Count + 1) >= this.options.MaxPoolSize)
						{
							if ((DateTime.Now.Ticks - start) > timeout)
							{
								throw new SystemException("Timeout exceeded.");
							}

							Thread.Sleep(100);
						}
						else
						{
							break;
						}
					}
				}
			}
		}

Соответственно, поставил в настройках коннекта:
cs.MaxPoolSize = 200;

Падать перестало, прога раздувается в памяти до 34 метров и виснет! Почему - непонятно.
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314626
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВ результате до сих пор правильным является ReadUncommitted
Не советуй плохого. Правильным является Snapshot (или во что там у точко-нетчиков
отображается concurrency).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Многопоточная нагрузка сервера - timeout exceeded exception
    #37314746
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DSНе советуй плохого.
ну, из лучшего я могу посоветовать забить на .Net вообще.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Многопоточная нагрузка сервера - timeout exceeded exception
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]