multi-thread server

9 отговора 416 прегледа
#1

multi-thread server

Здравейте,
Имам многонишков socket server(нишките са pthread),
но при заяваки от прекалено много клиенти
на server ми изплюва сигнал SIGSEGV и грешка
"Too many open files". Пробвах да вдигна броят на файловите
дескриптори посредством setrlimit но след това пак изплюва
сигнал SIGSEGV и грешка "Resource unavailabel".
Та випроса ми е как да разреша този проблем.
Разцепих се да ровя из google да настроивам TCP за max
брой connection и т.н. но .....
Server се тества с около 4800 connection
Дистрибуцията е Suse 9.0

Благодаря !

Отговор
в отговор на ilko #2

Re: multi-thread server

Тази грешка може да идва от доста неща. Все пак виж си параметрите на ядрото, но освен за файловете гледай и параметрите за процесите.
Командата сигурно я знаеш, но ти я пускам за всеки случай
# sysctl -a

I feel like I should have a great idea right now. But I don't.
Отговор
в отговор на Linux.Lab #3

Re: multi-thread server

Но при по-малко connection server работи без проблем

Отговор
в отговор на ilko #4

Re: multi-thread server

Ами, както се досещаш не достига някъде ресурс за нещо и по тази причина отгърмява.

I feel like I should have a great idea right now. But I don't.
Отговор
в отговор на Linux.Lab #5

Re: multi-thread server

Досештам се но не знам как какво да пипна.
Разбих се от четене и търсене из google амааааааа ...

Отговор
в отговор на ilko #6

Re: multi-thread server

В действителност възможностите са доста и съвет наизуст не мога да дам. Пак ти казвам да разледаш добре параметрите на ядрото. Най-вероятната за момента за мен причина е изчерпването на ресур или достигане на лимитирана стойност с в ядрото.

I feel like I should have a great idea right now. But I don't.
Отговор
в отговор на ilko #7

Re: multi-thread server

Преди всичко друго би могъл _внимателно_ да прегледаш кода си за неправилно използване на файлови дескриптори -- възможно е поради грешка да ги отваряш и никога да не ги затваряш.

После можеш да направиш няколко неща:
- да видиш с getrlimit колко е "твърдия" максимум за отворени файлове;
- да си "поиграеш" с fs.file-max и fs.file-nr параметри на ядрото;
- да погледнеш изходния код на ядрото за твърдо зададените "максимални максимални" стойности на броя отворени файлове.

Предполагам, след това ще ти "светне под шапката". Успех.


RTFM!
--sdg
Отговор
в отговор на ilko #8

Re: multi-thread server

Съветите на Linux.Lab и sdg са много добри. Само да допълня няколко неща:

- SEGV при невъзможност за отваряне на файл е следствие на грозно написан код. Оправи си кода.

- В някои случаи дори при затваряне на сокет, той продължава да е отворен известно време. Например ако преди това са изпратени данни, които не са потвърдени от другата страна на сокета.

- Провери броя на отворени от приложението файлове, както и броя и състоянието на сокетите, в момента на забиването. Може да ти просветне нещо.

Отговор
в отговор на ilko #9

Re: multi-thread server

Благодаря на всички за отговорите по темата

Отговор
в отговор на ilko #10

Re: multi-thread server

Taka kato te slusham sam pochti ubeden che previshavash max open files za procesa koito po default sa 1024. E nqkoi distribucii mogat i na poveche da se nastroqt ama eto ti edin otkys za da vidish kyde se nastroivat tiq bozi. Trqbva da recompilensh kernel:

Edit the sem.h file (vi +66 /usr/src/linux/include/linux/sem.h) and change the following parameter:
#define SEMMNI 128 /* <= IPCMNI max # of semaphore identifiers */
To read:
#define SEMMNI 512 /* <= IPCMNI max # of semaphore identifiers */

Edit the limits.h file (vi /usr/src/linux/include/linux/limits.h) and change the following parameters:
#define NR_OPEN 1024
To read:
#define NR_OPEN 8192

#define OPEN_MAX 256 /* # open files a process may have */
To read:
#define OPEN_MAX 8192 /* # open files a process may have */

Edit the posix_types.h file (vi +25 /usr/src/linux/include/linux/posix_types.h) and change the following parameter:
#define __FD_SETSIZE 1024
To read:
#define __FD_SETSIZE 8192

Отговор