21.03.11 @ 17:45 Lystopad Aleksandr wrote:
>> called/total parents
>>index %time self descendents called+self name index
>> called/total children
>>
>> 485.00 227154.59 678354/678354 ipfw_nat [8]
>>[10] 36.0 485.00 227154.59 678354 LibAliasIn [10]
>> 151066.41 1.70 678355/799402 _mtx_lock_sleep
>>[11]
>> 1053.00 75033.48 794/794 LibAliasInLocked
>>[14]
>>
>>То есть, несколько тредов одновременно постоянно дерутся за доступ к
>>instance ната - оно не параллелится. Решение: натить в несколько
внешних
>>IP-адресов, для каждого заводить отдельный инстанс libalias (ipfw
nat).
>
>Вадим, можно мне пояснить, вернее разжевать, такое: нагрузка в emX:
>taskq. Так? В первых постах топикстартер показывает свой трафик:
>7-10кппс и 7-9МБс. На такой нагрузке нат как бы не должен
>выпендриваться. Почему вспсплески по CPU у топикстартера получаются?
>
>У меня более слабая машинка натила под 200мбит без проблем!
Это значит, что ему попался такой паттерн трафика, на котором у libalias
возникают проблемы. У хэш-функций такое не редкость, что некоторые
граничные случаи приводят к большому количеству коллизий (а хэш в
libalias
довольно тупой), вероятно, топикстартеру как раз и не повезло. Впрочем,
такие проседания случаются время от времени, я бы предположил, что во
время чистки старых записей в таблице.
Вадим, пожалуйста, объясни это поподробней. Очень интересно. Как
работает эта хэш-функция. Опиши подобный граничный случай. Может, с
твоей помощью уйдет PR разработчикам и freebsd станет чуточку лучше?
Для этого как раз смотреть надо, что у него реально, поскольку случаев
много, ибо код там очень простой:
n = alias_addr.s_addr; /* alias_* принадлежат самому NAT box
*/
if (link_type != LINK_PPTP)
n += alias_port;
n += link_type;
return (n % LINK_TABLE_IN_SIZE);
Использовать удаленные адрес-порт оно не может, потому что в этот же слот
должен попасть и первый входящий пакет для редиректа, от кого угодно.
Для out-случая оно использует оба адреса и порта.
--
WBR, Vadim Goncharov