<div class="gmail_quote">2008/3/12 Igor Sysoev <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div class="Wj3C7c">On Wed, Mar 12, 2008 at 04:00:55AM +0300, Alexander Zheglov wrote:<br>
<br>
> Добрый день!<br>
> Написал и использую модуль для ограничения количества запросов к серверу за<br>
> промежуток времени с одного IP. Данные организованы следующим образом: в<br>
> разделяемой памяти хранятся связанные списки структур статистики по ip<br>
> адресам, нужная строка выбирается простой хеширующей функцией от ip адреса.<br>
> Соответсвенно там происходит выделение и освобождение памяти. Для защиты<br>
> указателей списка во время поиска по строке я использую pthread_mutex_lock<br>
> на строку. Чтобы понятнее было:<br>
> ..<br>
> addr = ((struct sockaddr_in *) (r->connection->sockaddr))->sin_addr.s_addr;<br>
> key = rlimit_hash_key(addr, ..);<br>
> ..<br>
> pthread_mutex_lock(&ctx->hash_locks[key]);<br>
> ..<br>
> тут ищем статистику, в общем шаримся по разделяемой памяти<br>
> ..<br>
> ret = check_node(..);<br>
> pthread_mutex_unlock(&ctx->hash_locks[key]);<br>
> return ret;<br>
><br>
> Обработчик устанавливается через:<br>
> ..<br>
> h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);<br>
> ..<br>
><br>
> Собственно вопрос в чем. Я печатаю статистику работы модуля и число<br>
> процессов в критическом интервале все время равно нулю, несмотря на довольно<br>
> значительную загрузку сервера. У меня складывается ощущение, что я чего-то<br>
> не понимаю.<br>
> То ли вообще нет необходимости в защите разделяемой памяти в этом месте, то<br>
> ли это специфично только для freeBSD. Под Linux, увы, нет достаточно<br>
> нагруженного сервера.<br>
> Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
> С уважением, Александр<br>
> P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?<br>
<br>
</div></div>Где находится &ctx->hash_locks[key] ? В разделяемой памяти ?<br>
<br>
Я для взаимного исключения процессов использую<br>
ngx_shmtx_lock()/ngx_shmtx_trylock/ngx_shmtx_unlock(),<br>
которые для i386/amd64/sparc64/ppc сейчас используют атомарные инструкции<br>
с уходом в sched_yield().<br>
<div><div></div><div class="Wj3C7c"><br>
</div></div></blockquote><div><br>Добрый день, Игорь! Да, конечно в разделяемой. За основу я взял Ваш limit_zone, но некоторые решения для моей задачи мне показались не эффективными.<br><br>Я старался по максимуму использовать api nginxа, нашел функции ngx_mutex_lock и тд, но в функции ngx_mutex_init выделение производится через ngx_alloc, так что я вернулся на стандартное api.<br>
<br>Алексей Тутубалин мне уже ответил на заданные вопросы, было бы также очень интересно услышать Ваше мнение. Спасибо.<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div class="Wj3C7c"><br>
--<br>
Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
<br>
</div></div></blockquote></div><br>