Re: Необходимость взаимного исключения процессов/нитей

Alexander Zheglov tolko.bi.vyzhit at gmail.com
Wed Mar 12 16:26:18 MSK 2008


2008/3/12 Igor Sysoev <is at rambler-co.ru>:

> On Wed, Mar 12, 2008 at 04:00:55AM +0300, Alexander Zheglov wrote:
>
> > Добрый день!
> > Написал и использую модуль для ограничения количества запросов к серверу
> за
> > промежуток времени с одного IP. Данные организованы следующим образом: в
> > разделяемой памяти хранятся связанные списки структур статистики по ip
> > адресам, нужная строка выбирается простой хеширующей функцией от ip
> адреса.
> > Соответсвенно там происходит выделение и освобождение памяти. Для защиты
> > указателей списка во время поиска по строке я использую
> pthread_mutex_lock
> > на строку. Чтобы понятнее было:
> > ..
> > addr = ((struct sockaddr_in *)
> (r->connection->sockaddr))->sin_addr.s_addr;
> > key = rlimit_hash_key(addr, ..);
> > ..
> > pthread_mutex_lock(&ctx->hash_locks[key]);
> > ..
> > тут ищем статистику, в общем шаримся по разделяемой памяти
> > ..
> > ret = check_node(..);
> > pthread_mutex_unlock(&ctx->hash_locks[key]);
> > return ret;
> >
> > Обработчик устанавливается через:
> > ..
> > h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
> > ..
> >
> > Собственно вопрос в чем. Я печатаю статистику работы модуля и число
> > процессов в критическом интервале все время равно нулю, несмотря на
> довольно
> > значительную загрузку сервера. У меня складывается ощущение, что я
> чего-то
> > не понимаю.
> > То ли вообще нет необходимости в защите разделяемой памяти в этом месте,
> то
> > ли это специфично только для freeBSD. Под Linux, увы, нет достаточно
> > нагруженного сервера.
> > Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?
> > С уважением, Александр
> > P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем,
> семафоры?
>
> Где находится &ctx->hash_locks[key] ? В разделяемой памяти ?
>
> Я для взаимного исключения процессов использую
> ngx_shmtx_lock()/ngx_shmtx_trylock/ngx_shmtx_unlock(),
> которые для i386/amd64/sparc64/ppc сейчас используют атомарные инструкции
> с уходом в sched_yield().
>
>
Добрый день, Игорь! Да, конечно в разделяемой. За основу я взял Ваш
limit_zone, но некоторые решения для моей задачи мне показались не
эффективными.

Я старался по максимуму использовать api nginxа, нашел функции
ngx_mutex_lock и тд, но в функции ngx_mutex_init выделение производится
через ngx_alloc, так что я вернулся на стандартное api.

Алексей Тутубалин мне уже ответил на заданные вопросы, было бы также очень
интересно услышать Ваше мнение. Спасибо.


>
> --
> Игорь Сысоев
> http://sysoev.ru
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20080312/12ae30ec/attachment.html>


More information about the nginx-ru mailing list