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

Возникла такая штуковина. Есть сервер 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
18.06.2011, 11:48
    #37313867
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
Дополнение: заметил, что если запустить одно приложение и 100 коннектов - то валится эксепшен, но если 2 экземпляра приложения по 50 коннектов - то не валится.
...
Рейтинг: 0 / 0
18.06.2011, 11:58
    #37313871
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
TopSpaceпришлось только увеличить на сервере лимит подключений с одного ip
это как?
TopSpaceУдалось установить, что явной зависимости от числа коннектов - нет. Если запустить 200 - то ошибка просто возникнет быстрее, чем на 150.
Classic, SuperServer? Код ошибки в коде обрабатывается? В какой именно момент ошибка проявляется? Памяти сколько все это жрет, в виртуал ничего не вываливается? Тредов столько же сколько коннектов?
...
Рейтинг: 0 / 0
18.06.2011, 12:11
    #37313877
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
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
18.06.2011, 12:16
    #37313884
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
TopSpaceЕсть некие настройки сервера Firebird 2.5, в том числе - лимит подключений с одного ip (по умолчанию 30).
то есть, на сервере линукс?

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

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


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


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


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

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


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

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

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

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

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

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

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

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

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

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

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

А что там за косяк с ReadCommited?
...
Рейтинг: 0 / 0
19.06.2011, 00:40
    #37314455
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
metaclassА что там за косяк с ReadCommited?
а он с no_rec_version. автор драйвера не соображает, хотя ему неоднократно не только намекали, но и писали в трекер
http://tracker.firebirdsql.org/browse/DNET-337
В результате до сих пор правильным является ReadUncommitted, а неправильным - ReadCommitted.
...
Рейтинг: 0 / 0
19.06.2011, 00:41
    #37314456
metaclass
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
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
19.06.2011, 00:46
    #37314460
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
ага. и получается маразм - кто напарывается, жалуется на ФБ. или не жалуется, а молча забивает. И так оно неисправлено висит уже несколько лет, если не ошибаюсь.
В ODBC тоже был аналогичный загиб, но его исправили недавно.
Вывод - драйверописатели .Net и ODBC не работают с FB.
...
Рейтинг: 0 / 0
19.06.2011, 10:12
    #37314539
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
Нашел в исходниках .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
19.06.2011, 13:09
    #37314626
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
kdvВ результате до сих пор правильным является ReadUncommitted
Не советуй плохого. Правильным является Snapshot (или во что там у точко-нетчиков
отображается concurrency).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
19.06.2011, 15:55
    #37314746
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная нагрузка сервера - timeout exceeded exception
DSНе советуй плохого.
ну, из лучшего я могу посоветовать забить на .Net вообще.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Многопоточная нагрузка сервера - timeout exceeded exception / 25 сообщений из 51, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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