18.03.11 @ 21:45 Alexey Karguine wrote:

Ну так vmstat вышеуказанный-то где?

Только что был очередной приступ. vmstat -{zm} сделать успел. Результат
в приложенных файлах. Посмотрите пожалуйста, сам я в эти цифрахникогда не разберусь.

В vmstat -z ничего такого нет, кроме большого числа кэша vnode (к 82000 файлов обращались), да еще строки:

128:    128,        0,   137977,    50663, 107517508,        0

которую проясняет vmstat -m:

    Type InUse MemUse HighUse Requests  Size(s)
libalias 137337 17231K       - 107197469  128

Число не ахти какое большое, но больше ничего подозрительного в vmstat -m/-z нет.

Это программная проблема, taskq уже не в hardware interrupt крутится, так что не поможет.

http://lists.freebsd.org/pipermail/freebsd-current/2006-February/061096.html - пересобрать ядро по инструкции отсюда, попробовать остальные шаги во время затыка.

Сделал. Чтобы не поднимать трафик в рассылке файл с выходными данными (~290 килобайт) выложил тут: http://dl.dropbox.com/u/83258/hwpmc.txt

Делал так:
- во время затыка запустил pmcstat -S instructions -O /tmp/sample.out
- нажал ctrl-c после того, как затык прошёл. Получил такое вообщение в консоле: pmcstat: WARNING: some events were discarded. Please consider tuning the "kern.hwpmc.nbuffers" tunable.
- pmcstat -R /tmp/sample.out -k /boot/kernel/kernel -g
- gprof /boot/kernel/kernel /tmp/INSTR_RETIRED_ANY/kernel.gmon

Да в общем-то можно было не выкладывать, там самое главное в строчках Top-5 пожирателей времени (80% времени в сумме):

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 36.9  233576.00 233576.00     3080 75836.36 76859.98  sched_idletd [9]
 28.2  411599.00 178023.00   799402   222.70   222.70  _mtx_lock_sleep [11]
 11.8  485951.00 74352.00      252 295047.62 296047.62  _FindLinkIn [16]
  2.1  499405.00 13454.00     2390  5629.29 116656.65  ipfw_chk [6]
  1.8  510634.00 11229.00    11536   973.39  1001.30  rn_match [26]

Это явный lock contention (glebius@ тут считает, что если сделать ядро с MUTEX_PROFILING, то будет видно, что libalias лок - most contended). Там выше в call graph есть подтверждение:

                                  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). Я в свое время бил кусками по /28 (16 адресов на один внешний), исходя из лимитов числа соединений с адреса на торрент-трекерах, аськосерверах и т.д.

Еще вариант, менее выигрышный и более сложный: пропатчить исходники, в /usr/src/sys/netinet/libalias/alias_local.h необходимо найти и заменить две константы, которые cо времен 7.1 равняются 4001. Сделать их такими:

#define LINK_TABLE_OUT_SIZE        8123
#define LINK_TABLE_IN_SIZE         16411

и пересобрать ядро (и при каждом обновлении исходников придется руками поддерживать патченым так).

--
WBR, Vadim Goncharov

Ответить