<div class="gmail_quote">2008/3/12 Igor Sysoev &lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt;:<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>
&gt; Добрый день!<br>
&gt; Написал и использую модуль для ограничения количества запросов к серверу за<br>
&gt; промежуток времени с одного IP. Данные организованы следующим образом: в<br>
&gt; разделяемой памяти хранятся связанные списки структур статистики по ip<br>
&gt; адресам, нужная строка выбирается простой хеширующей функцией от ip адреса.<br>
&gt; Соответсвенно там происходит выделение и освобождение памяти. Для защиты<br>
&gt; указателей списка во время поиска по строке я использую pthread_mutex_lock<br>
&gt; на строку. Чтобы понятнее было:<br>
&gt; ..<br>
&gt; addr = ((struct sockaddr_in *) (r-&gt;connection-&gt;sockaddr))-&gt;sin_addr.s_addr;<br>
&gt; key = rlimit_hash_key(addr, ..);<br>
&gt; ..<br>
&gt; pthread_mutex_lock(&amp;ctx-&gt;hash_locks[key]);<br>
&gt; ..<br>
&gt; тут ищем статистику, в общем шаримся по разделяемой памяти<br>
&gt; ..<br>
&gt; ret = check_node(..);<br>
&gt; pthread_mutex_unlock(&amp;ctx-&gt;hash_locks[key]);<br>
&gt; return ret;<br>
&gt;<br>
&gt; Обработчик устанавливается через:<br>
&gt; ..<br>
&gt; h = ngx_array_push(&amp;cmcf-&gt;phases[NGX_HTTP_PREACCESS_PHASE].handlers);<br>
&gt; ..<br>
&gt;<br>
&gt; Собственно вопрос в чем. Я печатаю статистику работы модуля и число<br>
&gt; процессов в критическом интервале все время равно нулю, несмотря на довольно<br>
&gt; значительную загрузку сервера. У меня складывается ощущение, что я чего-то<br>
&gt; не понимаю.<br>
&gt; То ли вообще нет необходимости в защите разделяемой памяти в этом месте, то<br>
&gt; ли это специфично только для freeBSD. Под Linux, увы, нет достаточно<br>
&gt; нагруженного сервера.<br>
&gt; Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
&gt; С уважением, Александр<br>
&gt; P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?<br>
<br>
</div></div>Где находится &amp;ctx-&gt;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>&nbsp;</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>