ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: Необходимость взаимного исключения процессов/нитей
  • From: "Alexander Zheglov" <tolko.bi.vyzhit@xxxxxxxxx>
  • Date: Wed, 12 Mar 2008 16:26:18 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; bh=iMHmytGdFqbhMhhXxW0bzEob25RONmiPb0kwgnyv38M=; b=lXaIpV13GQamtpwvqM3/ZtiSSvO5sSMNzxnCtUQFTSJ6RcJ3MSjypN0xjKnFACL5JtSi8vVchqvltobftjJDArP9VFMuXW2FbCkDt5IW2gB9FMzv0NOfxjyJkOJvb34JvF0ykLyuwBiIujQFVApdiUEwjb0aCtJLax6bqTL3Zpc=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=FRcam/pOrUk4NWTBHYx2KI9IIT1IrqsVmuU3fBT9fonpzjX5lIZsJKJV0gKFg9dazCnZuX+7/B4OdlyipOnG5t1Lm5WG+h4dfjy745lVrAZUgxUtZgTQmHV3Hia4RcT9HjKVeHTYClZL+w5xkybIXs5f4B+DVBbNRzrKgx2ixA0=
  • In-reply-to: <20080312075458.GD41730@xxxxxxxxxxxxx>
  • References: <f3f03edb0803111800s3d8b8de7i682906f9836469b0@xxxxxxxxxxxxxx> <20080312075458.GD41730@xxxxxxxxxxxxx>

2008/3/12 Igor Sysoev <is@xxxxxxxxxxxxx>:
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




 




Copyright © Lexa Software, 1996-2009.