2008/3/13 Igor Sysoev <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>>:<br><div class="gmail_quote"><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:26:18PM +0300, Alexander Zheglov wrote:<br>
<br>
> 2008/3/12 Igor Sysoev <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>>:<br>
><br>
> > On Wed, Mar 12, 2008 at 04:00:55AM +0300, Alexander Zheglov wrote:<br>
> ><br>
> > > Добрый день!<br>
> > > Написал и использую модуль для ограничения количества запросов к серверу<br>
> > за<br>
> > > промежуток времени с одного IP. Данные организованы следующим образом: в<br>
> > > разделяемой памяти хранятся связанные списки структур статистики по ip<br>
> > > адресам, нужная строка выбирается простой хеширующей функцией от ip<br>
> > адреса.<br>
> > > Соответсвенно там происходит выделение и освобождение памяти. Для защиты<br>
> > > указателей списка во время поиска по строке я использую<br>
> > pthread_mutex_lock<br>
> > > на строку. Чтобы понятнее было:<br>
> > > ..<br>
> > > addr = ((struct sockaddr_in *)<br>
> > (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>
> > > не понимаю.<br>
> > > То ли вообще нет необходимости в защите разделяемой памяти в этом месте,<br>
> > то<br>
> > > ли это специфично только для freeBSD. Под Linux, увы, нет достаточно<br>
> > > нагруженного сервера.<br>
> > > Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
> > > С уважением, Александр<br>
> > > P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем,<br>
> > семафоры?<br>
> ><br>
> > Где находится &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>
> ><br>
> ><br>
> Добрый день, Игорь! Да, конечно в разделяемой. За основу я взял Ваш<br>
> limit_zone, но некоторые решения для моей задачи мне показались не<br>
> эффективными.<br>
><br>
> Я старался по максимуму использовать api nginxа, нашел функции<br>
> ngx_mutex_lock и тд, но в функции ngx_mutex_init выделение производится<br>
> через ngx_alloc, так что я вернулся на стандартное api.<br>
<br>
</div></div>Нужно использовать не ngx_mutex_lock, а ngx_shmtx_lock().<br>
Он создаётся ngx_shmtx_create.<br>
<div class="Ih2E3d"><br>
> Алексей Тутубалин мне уже ответил на заданные вопросы, было бы также очень<br>
> интересно услышать Ваше мнение. Спасибо.<br>
<br>
</div>Что показывает ldd nginx, сколько используется воркеров ?<br>
<font color="#888888"><br>
</font></blockquote><div><br>Посмотрел реализацию. Игорь, дело в том, что для обеспечения возможной
параллельной обработки запросов я осуществляю лок на строку
хеш-таблицы. Таких строк - 256. Если используется более одного пула
статистики, количество пропорционально возрастает. Мне кажется, что
256*количество пулов файловых дескрипторов это достаточно серьезное
ограничение. Я неправ? Мой интерес к задаче связан с тем, что хочется выдержать концепцию нгинкса на максимальную производительность, и Ваше мнение здесь очень интересно.<br><br>ldd nginx? Вы имели ввиду вот это?<br>> ldd nginx<br>
nginx:<br> libcrypt.so.3 => /lib/libcrypt.so.3 (0xa80c2000)<br> libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0xa80da000)<br> libz.so.3 => /lib/libz.so.3 (0xa80f5000)<br> libc.so.6 => /lib/libc.so.6 (0xa8106000)<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;"><font color="#888888"><br>
--<br>
</font><div><div></div><div class="Wj3C7c">Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
<br>
</div></div></blockquote></div><br>