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

Ответить