Re: smtp recieving channels

От: Iliya Peregoudov <CGatePro_at_mx_ru>
Дата: Fri 16 Nov 2007 - 10:49:15 MSK

Andrew V.Statsenko wrote:
> В Чтв, 15/11/2007 в 18:09 +0300, Dmitry Akindinov пишет:

>> Здравствуйте,

>
>> В линуксе по умолчанию процесс ограничен 1024 тредами, а в CGPro каждое
>> активное сетевое соединение отрабатывается отдельнымтредом. Поэтому,
>> когда тредов. отрабатывающих SMTP, становится слишком много, у процесса
>> могут начаться проблемы с созданием тредов для отработки запросов по
>> другим протоколам.

>
>
> Хм.. Дмитрий, за что ж вы так Linux не любите ? :-)
>
> alter@alter:~/tmp/src$ ulimit -s
> 8192
>
> alter@alter:~/tmp/src$ ./pthead
> Hello World! It's me, thread #0!
> Hello World! It's me, thread #1!
> ....
>
> Hello World! It's me, thread #377!
> Hello World! It's me, thread #378!
> ERROR; return code from pthread_create() is 12
>
>
> Ой.. упали... Ну ничего :-)
>
>
> alter@alter:~/tmp/src$ ulimit -s 256
>
> alter@alter:~/tmp/src$ ./pthead
> Hello World! It's me, thread #0!
> Hello World! It's me, thread #1!
> ....
>
> Hello World! It's me, thread #8190!
> Hello World! It's me, thread #8191!
>
>
> alter@alter:~/tmp/src$ ps -L -p 12801 | wc -l
> 8194
>
> Таки взлетело !
>
> Для себя я это ничем иным как pre-commited thread stack объяснить не
> могу.
>

libpthread выделяет под каждый тред стек. И все эти стеки размещаются в одном адресном пространстве -- адресном пространстве процесса. Собственно вызов pthread_create() и создаёт стек для запускаемого треда. Если в вызов pthread_create() не было передано атрибута, задающего размер стека, pthread_create() использует размер по умолчанию. Например, на RHEL3 это 10M. При использовании стека по умолчанию создать в одном процессе больше 3G/10M=~3K тредов не получится. Если хочется много редов, надо задавать размер их стеков с помощью pthread_attr_setstacksize(). Делает ли это Communigate для Linux? Можно попробовать посмотреть с помощью pmap (у меня нет Communigate поэтому на примере произвольного многотредового процесса):

# pmap 15168
15168: cbs_ppssg
Start Size Perm Mapping
[...skip shared libraries...]

08048000       92K r-xp /opt/CBOSSip/CBSppssg/sbin/cbs_ppssg
0805f000        4K rw-p /opt/CBOSSip/CBSppssg/sbin/cbs_ppssg
0948c000      256K rw-p [ anon ]
b524c000        4K ---p [ anon ] |
b524d000       64K rw-p [ anon ] + стек 64K #1
b525d000        4K ---p [ anon ] |
b525e000       64K rw-p [ anon ] + стек 64K #2
b526e000        4K ---p [ anon ]
b526f000     6216K rw-p [ anon ]
b5881000        4K ---p [ anon ] |
b5882000    10240K rw-p [ anon ] + стек 10M #3
b6282000        4K ---p [ anon ] |
b6283000       64K rw-p [ anon ] + стек 64K #4
b6293000        4K ---p [ anon ] |
b6294000    19800K rw-p [ anon ] + heap
b75f5000        4K rw-p [ anon ]
bfff6000       40K rw-p [ stack ] + стек главного треда
mapped: 42528K writeable/private: 37072K shared: 0K

В процессе несколько тредов со стеками по 64K и один со стеком 10M. Видимо, код создания этих тредов был написан разными разработчиками -- один указал размер стека 64K, другой не указал, и стек был создан с размером по умолчанию. Получено Fri Nov 16 07:49:21 2007

Этот архив был сгенерирован hypermail 2.1.8 : Fri 24 Apr 2015 - 16:15:52 MSK