Closed hotid closed 10 years ago
10гбит мы не тестировали. Подумаю над вашими данными. Как я понял Natevents вы не используете (эту фичу я хочу удалить в будущем). Интересно "55.87% [kernel] [k] _raw_spin_lock" какой там stack trace.
В git версии уже есть оптимизация для лучшего распараллеливания, но может её недостаточно, надо думать и смотреть, но к сожалению у меня настолько загруженного сервера нет.
10Гбит - это суммарный траффик проходящий в обе стороны, т.е. на сервер с одной стороны пришло около 7-8 гбит, с другой стороны - 2-3.
natevents не используем, пока руки не доходили до них.
Если подскажете как посмотреть stack trace - с радостью покажу.
Насколько я понял - до какого-то момента всё работало нормально, включение netflow добавляло процентов 10 нагрузки, однако при достижении 5,5-6Гбит, по мере дальнейшего роста полосы - загрузка в течение часа выросла с 40% до 100%, после чего netflow отключили.
Попробую позже посмотреть не вернётся ли всё в норму при уменьшении количества трафика.
Насчет perf, наилучших команд не скажу, но там на период, скажем пара сек, надо запустить perf record
с опциями -a
и -g
(скажем perf record -ag sleep 1
), а потом кажется perf report -g
, и нажмите там ентер на верхнюю строку где максимальная нагрузка cpu, скорее всего это будет _raw_spin_lock
и оно должно показать call graph, надеюсь. К сожалению не гуру по perf.
Хм, сейчас совсем подругому выглядит:
57.46% [kernel] [k] memcmp
6.32% [kernel] [k] _raw_spin_lock
5.76% [kernel] [k] netflow_target
3.19% [kernel] [k] ____nf_conntrack_find
2.45% [kernel] [k] fib_table_lookup
1.44% [kernel] [k] ixgbe_clean_rx_irq
1.34% [kernel] [k] ipt_do_table
1.31% [kernel] [k] _raw_read_unlock_bh
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 2000000 (peak 2000002 reached 0d0h0m ago), mem 328125K, worker delay 1/250.
Hash: size 8192 (mem 64K), metric 17.24 [7.75, 3.56, 1.92]. MemTraf: 70248134 pkt, 54304017 K (pdu 1, 189), Out 34594222 pkt, 27525952 K.
Rate: 2835581474 bits/sec, 480407 packets/sec; Avg 1 min: 4216948022 bps, 687468 pps; 5 min: 2712760945 bps, 427786 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 9387348410 101565070 4166237 [89.78], 0 0 0 888952, sock: 42577 0 42577, 60870 K, traffic: 104842355, 79912 MB, drop: 888952, 240889 K
cpu0 stat: 852666637 9372715 285911 [89.28], 0 0 0 65531, sock: 0 0 0, 0 K, traffic: 9593095, 9442 MB, drop: 65531, 28532 K
cpu1 stat: 897818441 9721017 288348 [90.69], 0 0 0 66900, sock: 0 0 0, 0 K, traffic: 9942465, 9752 MB, drop: 66900, 30428 K
cpu2 stat: 877686146 9538646 283028 [90.36], 0 0 0 73717, sock: 42577 0 42577, 60870 K, traffic: 9747957, 9413 MB, drop: 73717, 36984 K
cpu3 stat: 814788436 9052993 275921 [88.34], 0 0 0 64737, sock: 0 0 0, 0 K, traffic: 9264177, 9104 MB, drop: 64737, 29957 K
cpu4 stat: 855500216 9405668 275731 [89.36], 0 0 0 64674, sock: 0 0 0, 0 K, traffic: 9616725, 9192 MB, drop: 64674, 29273 K
cpu5 stat: 821964211 9118140 278366 [88.47], 0 0 0 66208, sock: 0 0 0, 0 K, traffic: 9330298, 8943 MB, drop: 66208, 31206 K
cpu6 stat: 715233252 7604971 420738 [90.11], 0 0 0 83596, sock: 0 0 0, 0 K, traffic: 7942113, 4044 MB, drop: 83596, 9426 K
cpu7 stat: 716161731 7650890 426104 [89.66], 0 0 0 81765, sock: 0 0 0, 0 K, traffic: 7995229, 4083 MB, drop: 81765, 9237 K
cpu8 stat: 706144068 7515407 403255 [90.17], 0 0 0 80142, sock: 0 0 0, 0 K, traffic: 7838520, 3790 MB, drop: 80142, 8843 K
cpu9 stat: 701037384 7393608 406882 [90.87], 0 0 0 79944, sock: 0 0 0, 0 K, traffic: 7720546, 3746 MB, drop: 79944, 8934 K
cpu10 stat: 719802766 7639043 413498 [90.38], 0 0 0 80464, sock: 0 0 0, 0 K, traffic: 7972077, 4248 MB, drop: 80464, 8976 K
cpu11 stat: 708546679 7551983 408456 [90.00], 0 0 0 81275, sock: 0 0 0, 0 K, traffic: 7879164, 4148 MB, drop: 81275, 9086 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 2000000
Natevents disabled, count start 0, stop 0.
conntrack -S
entries 682135
Ерунда какая-то....
Сходу perf record/report не осилил, завтра попробую разобраться.
А, так и должно быть - это я hashsize не указал. С hashsize=4194304 и maxflows=8388608:
55.66% [kernel] [k] _raw_spin_lock
4.83% [kernel] [k] netflow_target
3.42% [kernel] [k] _raw_read_unlock_bh
3.26% [kernel] [k] ____nf_conntrack_find
3.12% [kernel] [k] fib_table_lookup
1.86% [kernel] [k] _raw_read_lock_bh
1.84% [kernel] [k] ixgbe_clean_rx_irq
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 694574 (peak 694574 reached 0d0h0m ago), mem 113953K, worker delay 1/250.
Hash: size 4194304 (mem 32768K), metric 1.10 [1.02, 1.00, 1.00]. MemTraf: 24291802 pkt, 19788720 K (pdu 4, 1306), Out 180155 pkt, 96702 K.
Rate: 9031966964 bits/sec, 1357789 packets/sec; Avg 1 min: 3582392219 bps, 539248 pps; 5 min: 840100402 bps, 126448 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 1910956 23724670 747287 [1.07], 0 0 0 0, sock: 1757 0 1757, 2511 K, traffic: 24471953, 19419 MB, drop: 0, 0 K
cpu0 stat: 156316 2236968 47682 [1.06], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2284650, 2208 MB, drop: 0, 0 K
cpu1 stat: 169840 2119845 48078 [1.07], 0 0 0 0, sock: 1757 0 1757, 2511 K, traffic: 2167923, 2085 MB, drop: 0, 0 K
cpu2 stat: 169281 2216891 46060 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2262950, 2113 MB, drop: 0, 0 K
cpu3 stat: 197828 2084334 45961 [1.09], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2130294, 1985 MB, drop: 0, 0 K
cpu4 stat: 165905 2224882 45317 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2270199, 2133 MB, drop: 0, 0 K
cpu5 stat: 176012 2131268 46070 [1.08], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2177337, 2033 MB, drop: 0, 0 K
cpu6 stat: 154856 1768044 80337 [1.08], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1848381, 1094 MB, drop: 0, 0 K
cpu7 stat: 132896 1812823 79400 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1892223, 1197 MB, drop: 0, 0 K
cpu8 stat: 151756 1826928 74875 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1901803, 1150 MB, drop: 0, 0 K
cpu9 stat: 136049 1765338 77044 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1842381, 1130 MB, drop: 0, 0 K
cpu10 stat: 164152 1814062 77730 [1.08], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1891791, 1169 MB, drop: 0, 0 K
cpu11 stat: 136068 1723311 78733 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1802044, 1115 MB, drop: 0, 0 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 8388608
Natevents disabled, count start 0, stop 0.
Трафика около 8Гбит in+out:
hashsize=65536 maxflows=2097152
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 642281 (peak 728124 reached 0d0h0m ago), mem 105374K, worker delay 1/250.
Hash: size 65536 (mem 512K), metric 0.95 [1.49, 1.27, 1.06]. MemTraf: 75415987 pkt, 62174669 K (pdu 21, 3196), Out 17107434 pkt, 12803364 K.
Rate: 8640058316 bits/sec, 1310139 packets/sec; Avg 1 min: 7957648532 bps, 1198162 pps; 5 min: 3093867760 bps, 465881 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 681223419 90110325 2413075 [8.36], 0 0 0 0, sock: 59026 0 59026, 84388 K, traffic: 92523400, 73220 MB, drop: 0, 0 K
cpu0 stat: 63097902 8650482 159769 [8.16], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 8810251, 8461 MB, drop: 0, 0 K
cpu1 stat: 59519206 8058667 160552 [8.24], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 8219219, 7695 MB, drop: 0, 0 K
cpu2 stat: 59397169 8276020 154270 [8.04], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 8430290, 8015 MB, drop: 0, 0 K
cpu3 stat: 56066397 7788994 154406 [8.05], 0 0 0 0, sock: 59026 0 59026, 84388 K, traffic: 7943400, 7374 MB, drop: 0, 0 K
cpu4 stat: 58904684 8092779 153793 [8.14], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 8246572, 7527 MB, drop: 0, 0 K
cpu5 stat: 60202854 8155008 155004 [8.24], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 8310012, 7498 MB, drop: 0, 0 K
cpu6 stat: 53777419 6903694 245469 [8.52], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 7149163, 4270 MB, drop: 0, 0 K
cpu7 stat: 55395644 7025451 259551 [8.60], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 7285002, 4700 MB, drop: 0, 0 K
cpu8 stat: 53865338 6902496 239330 [8.54], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 7141826, 4322 MB, drop: 0, 0 K
cpu9 stat: 56497530 6998797 240218 [8.80], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 7239015, 4646 MB, drop: 0, 0 K
cpu10 stat: 52643151 6745101 246548 [8.52], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 6991649, 4418 MB, drop: 0, 0 K
cpu11 stat: 51856272 6512859 244165 [8.67], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 6757024, 4290 MB, drop: 0, 0 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 2097152
Natevents disabled, count start 0, stop 0.
32.71% [kernel] [k] _raw_spin_lock
6.67% [kernel] [k] memcmp
5.92% [kernel] [k] netflow_target
4.48% [kernel] [k] ____nf_conntrack_find
4.38% [kernel] [k] fib_table_lookup
3.60% [kernel] [k] _raw_read_unlock_bh
2.69% [kernel] [k] _raw_read_lock_bh
2.68% [kernel] [k] ixgbe_clean_rx_irq
Количество flow НЕ растёт, кушает при этом под 20-25% процессора.
Перезагрузил модуль с hashsize=16384 maxflows=2097152
cat /proc/net/stat/ipt_netflow
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 840218 (peak 840218 reached 0d0h0m ago), mem 137848K, worker delay 1/250.
Hash: size 16384 (mem 128K), metric 5.74 [3.26, 1.58, 1.19]. MemTraf: 37830296 pkt, 30713039 K (pdu 25, 4006), Out 1310476 pkt, 861183 K.
Rate: 8735688900 bits/sec, 1320059 packets/sec; Avg 1 min: 5073089904 bps, 767700 pps; 5 min: 1349770158 bps, 204233 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 1043391651 38050382 1090365 [27.65], 0 0 0 0, sock: 8338 0 8338, 11920 K, traffic: 39140747, 30834 MB, drop: 0, 0 K
cpu0 stat: 88436760 3343694 71466 [26.89], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3415160, 3114 MB, drop: 0, 0 K
cpu1 stat: 92034484 3494683 71948 [26.80], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3566631, 3273 MB, drop: 0, 0 K
cpu2 stat: 92954705 3485238 68434 [27.15], 0 0 0 0, sock: 8338 0 8338, 11920 K, traffic: 3553672, 3266 MB, drop: 0, 0 K
cpu3 stat: 86071362 3279349 68498 [26.70], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3347847, 3077 MB, drop: 0, 0 K
cpu4 stat: 97564701 3655245 68285 [27.20], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3723530, 3480 MB, drop: 0, 0 K
cpu5 stat: 89335051 3353691 69391 [27.09], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3423082, 3116 MB, drop: 0, 0 K
cpu6 stat: 80567394 2817967 112057 [28.49], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2930024, 1804 MB, drop: 0, 0 K
cpu7 stat: 88945647 3073324 115415 [28.89], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3188739, 2142 MB, drop: 0, 0 K
cpu8 stat: 83963234 2958628 109424 [28.36], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3068052, 1885 MB, drop: 0, 0 K
cpu9 stat: 80447957 2801303 109741 [28.63], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2911044, 1789 MB, drop: 0, 0 K
cpu10 stat: 81121932 2889989 113137 [28.01], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3003126, 1901 MB, drop: 0, 0 K
cpu11 stat: 81948996 2897292 112569 [28.22], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3009861, 1982 MB, drop: 0, 0 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 2097152
Natevents disabled, count start 0, stop 0.
19.85% [kernel] [k] _raw_spin_lock
10.95% [kernel] [k] memcmp
6.44% [kernel] [k] netflow_target
5.16% [kernel] [k] ____nf_conntrack_find
4.91% [kernel] [k] fib_table_lookup
3.48% [kernel] [k] _raw_read_unlock_bh
И active растёт дальше...
Снова загрузил с hashsize=65536 maxflows=2097152 - Flows: active 625117, грузит примерно 20% CPU и НЕ растёт, зараза.
Загружаю с hashsize=4194304 maxflows=8388608 (параметры, с которыми сегодня в ЧНН начался неконтролируемый рост active flows. В принципе - значения явно завышены, надо поделить как минимум на 2...исторически сложилось), получаю Flows: active 605657, не растут, при этом CPU нагружает где-то на 10%. perf top:
29.44% [kernel] [k] _raw_spin_lock
5.76% [kernel] [k] netflow_target
4.84% [kernel] [k] fib_table_lookup
4.77% [kernel] [k] ____nf_conntrack_find
3.69% [kernel] [k] _raw_read_unlock_bh
2.94% [kernel] [k] ixgbe_clean_rx_irq
Предполагаю, что у вас статистика правильная.
Total stat: 29079737 57272837 2898410 traffic: 59382696, 42897 MB, active 2097152, 1330298 packets/sec
Total stat: 55858373 125403065 4370993 traffic: 129774053, 93103 MB, active 4359473, 1326686 packets/sec
Согласно вашей статистике, у вас средняя длинна потока 19.7 и 28.6 пакетов, что, на мой взгляд, является нормальным для небольшого промежутка времени. MemTraf X pkt деленный на эту длину и даёт примерно столько потоков в памяти в данный момент. Rate X packets/sec деленная на эту длину дает сколько новых потоков у вас приходит в секунду (до 65к), при этом flow сидит в памяти минимум 15 (inactive timeout) секунд, то есть все это реально накапливается, до таких чисел. Большой трафик, плюс пиковая нагрузка.
Эмпирически советую вам поставить hashsize от 10000000 и выше. И не снижать при последующих тестах.
Total stat: 1043391651 38050382 1090365 [27.65],
Total stat: 681223419 90110325 2413075 [8.36],
27 и 8 значит хэш таблица используется крайне не эффективно - надо увеличивать пока не станет 1.
27 и 8 значит хэш таблица используется не эффективно надо увеличивать пока не станет 1
Это я для теста значения брал, в порядке бреда. В нормальной работе у нас получается что-то около [1.10].
Не понятно почему при разных hashsize отличается количество active flow на сотни тысяч. Модуль перезагружал с интервалом в пару минут, так что трафик не сильно отличался.
Четыре теста:
hashsize=65536 maxflows=2097152 Flows: active 642281 (peak 728124 reached 0d0h0m ago)
hashsize=16384 maxflows=2097152 Flows: active 840218 (peak 840218 reached 0d0h0m ago) ( active ПРОДОЛЖАЕТ УВЕЛИЧИВАТЬСЯ пока не достигнет maxflows)
hashsize=65536 maxflows=2097152 Flows: active 625117
hashsize=4194304 maxflows=8388608 Flows: active 605657 (трафик постепенно снижается, так что и количество flow падает).
Насчет почему в conntrac -S меньше entries - другая логика хранения потоков - другие тайм-ауты. Можете поиграться с active/inactive timeouts, скажем сделать одинаковые по несколько сек (вплоть до 1) - количество потоков должно сократиться, но возрастёт трафик экспорта.
hashsize не может влиять на кол-во active Flows, тут и думать не над чем. Это флуктуация. Маленькие значения hashsize зато сильно влияют на загрузку процессора. (Вы как-то сто проблем одновременно обсуждаете.)
Хорошо, не буду упоминать про процессор. Причины различий между контреком и netflow понятны.
Проблема в том, что в какой-то момент по непонятной причине active flow начинает расти вплоть до maxflows. АНАЛОГИЧНОГО поведения я сейчас добился поставив неадекватно маленький hashsize:
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 2097152 (peak 2097153 reached 0d0h0m ago), mem 344064K, worker delay 1/250.
Hash: size 8192 (mem 64K), metric 6.96 [5.86, 3.15, 1.82]. MemTraf: 89379489 pkt, 70885981 K (pdu 46, 5323), Out 1352333 pkt, 921521 K.
Rate: 3661956546 bits/sec, 580407 packets/sec; Avg 1 min: 4913953117 bps, 770426 pps; 5 min: 2708083367 bps, 418930 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 9163822354 88397001 2637498 [101.66], 0 0 0 302723, sock: 7920 0 7920, 11323 K, traffic: 90731776, 70124 MB, drop: 302723, 111698 K
cpu0 stat: 817565152 8097808 180498 [99.75], 0 0 0 22821, sock: 0 0 0, 0 K, traffic: 8255485, 7889 MB, drop: 22821, 13347 K
cpu1 stat: 807990686 8002625 183459 [99.70], 0 0 0 25306, sock: 0 0 0, 0 K, traffic: 8160778, 7645 MB, drop: 25306, 16503 K
cpu2 stat: 862131676 8603346 175451 [99.20], 0 0 0 25171, sock: 0 0 0, 0 K, traffic: 8753626, 8614 MB, drop: 25171, 17407 K
cpu3 stat: 810021754 7916901 174071 [101.11], 0 0 0 23693, sock: 0 0 0, 0 K, traffic: 8067279, 7552 MB, drop: 23693, 15409 K
cpu4 stat: 826733116 8097270 173358 [100.96], 0 0 0 22941, sock: 0 0 0, 0 K, traffic: 8247687, 7768 MB, drop: 22941, 13766 K
cpu5 stat: 838330485 8105367 175389 [102.23], 0 0 0 25153, sock: 0 0 0, 0 K, traffic: 8255603, 7726 MB, drop: 25153, 16567 K
cpu6 stat: 700600358 6739183 261834 [101.07], 0 0 0 25105, sock: 0 0 0, 0 K, traffic: 6975912, 3743 MB, drop: 25105, 2986 K
cpu7 stat: 705832849 6690712 266086 [102.45], 0 0 0 26803, sock: 0 0 0, 0 K, traffic: 6929995, 4195 MB, drop: 26803, 3146 K
cpu8 stat: 683179280 6471292 255738 [102.55], 0 0 0 26220, sock: 0 0 0, 0 K, traffic: 6700810, 3379 MB, drop: 26220, 3040 K
cpu9 stat: 694848441 6508912 261937 [103.62], 0 0 0 25060, sock: 0 0 0, 0 K, traffic: 6745789, 3791 MB, drop: 25060, 3002 K
cpu10 stat: 714223664 6631487 260218 [104.63], 0 0 0 26316, sock: 0 0 0, 0 K, traffic: 6865389, 3999 MB, drop: 26316, 3161 K
cpu11 stat: 702367053 6532102 269462 [104.26], 0 0 0 28137, sock: 7920 0 7920, 11323 K, traffic: 6773427, 3817 MB, drop: 28137, 3359 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 2097152
Это тот же самый сервер что упомянут выше, с тем же самым трафиком.
И ещё раз тот же сервер, но с другими параметрами hashsize:
ipt_NETFLOW version v1.8-88-g3d95a40, srcversion BB81820A4B072ABC44F32FF
Flows: active 523870 (peak 533546 reached 0d0h0m ago), mem 85947K, worker delay 1/250.
Hash: size 4194304 (mem 32768K), metric 1.10 [1.03, 1.00, 1.00]. MemTraf: 35855502 pkt, 29528943 K (pdu 65, 20065), Out 3968213 pkt, 2787687 K.
Rate: 7445914378 bits/sec, 1130918 packets/sec; Avg 1 min: 5163497979 bps, 776994 pps; 5 min: 1507080029 bps, 226688 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 3345901 38747277 1076374 [1.08], 0 0 0 0, sock: 36832 0 26, 52658 K, traffic: 39823650, 31559 MB, drop: 0, 0 K
cpu0 stat: 250421 3582739 71554 [1.06], 0 0 0 0, sock: 0 0 26, 0 K, traffic: 3654292, 3317 MB, drop: 0, 0 K
cpu1 stat: 282411 3436690 71899 [1.08], 0 0 0 0, sock: 36832 0 0, 52658 K, traffic: 3508589, 3065 MB, drop: 0, 0 K
cpu2 stat: 269415 3398486 68479 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3466965, 3246 MB, drop: 0, 0 K
cpu3 stat: 239421 3518530 68606 [1.06], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3587136, 3138 MB, drop: 0, 0 K
cpu4 stat: 224305 3408363 68434 [1.06], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3476796, 3136 MB, drop: 0, 0 K
cpu5 stat: 454002 3683836 67934 [1.12], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3751770, 3448 MB, drop: 0, 0 K
cpu6 stat: 304396 3192465 112586 [1.09], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3305051, 2128 MB, drop: 0, 0 K
cpu7 stat: 281691 3107588 111742 [1.08], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3219330, 2315 MB, drop: 0, 0 K
cpu8 stat: 234757 2931332 108503 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3039835, 2035 MB, drop: 0, 0 K
cpu9 stat: 287941 2822256 108350 [1.09], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2930605, 1830 MB, drop: 0, 0 K
cpu10 stat: 224213 2916398 109040 [1.07], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 3025438, 2061 MB, drop: 0, 0 K
cpu11 stat: 292930 2748625 109247 [1.10], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 2857872, 1836 MB, drop: 0, 0 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 8388608
Natevents disabled, count start 0, stop 0.
Как можно заметить - в первом случае Flows: active 2097152 Во втором - Flows: active 523870 На флуктуации, к сожалению, совсем не похоже.
Сервер тот же самый, но есть же колебания трафика. Обратите внимание, что у вас в первом случае packets/sec 580407, а во втором 1130918 в два раза больше. Очень много погрешности в данных - все равно что гадать по кофейной гуще.
АНАЛОГИЧНОГО поведения я сейчас добился поставив неадекватно маленький hashsize
Это интересно.
Да, я обратил внимание и на различия в кол-ве пакетов. Уверяю вас, трафик при этом через сервер бегает примерно одинаковый +-100мбит, и реальное количество пакетов не меняется.
Графики загрузки за день одного из ядер (остальные примерно одинаковы) http://igorsd.ru/graph_image_cpu.png и интерфеса http://igorsd.ru/graph_image.php.png
Рост загрузки cpu примерно совпадает с началом роста кол-ва active flows, пики - попытки включить сбор netflow с разными параметрами.
Подумаю на досуге как может hashsize влиять на кол-во потоков в памяти. По идее никак. Может быть там связь косвенная - маленький hashsize увеличивает нагрузку на процы, увеличивается latency, а это влияет на что-то ещё.
На флуктуации, к сожалению, совсем не похоже.
Похоже. В первом traffic stat 90731776 пакетов во втором 39823650 - разница в два-три раза. Соотв., в первом в памяти учтено 89379489 пакетов, во втором 35855502. В обоих случаях средняя длинна потока ~35 пакетов.
89379489 / 33.51 = 2667248.25, реальная цифра 4194304 ~ в два раза больше. 35855502 / 35.99 = 996262.90, реальная цифра 2097152 - в два раза больше. (Почему в два раза больше - не важно, главное, что почти совпадает.)
Природа IP трафика, что он очень неравномерный (там далеко не гауссово распределение и даже не пуассон). Плюс, кроме просто объема, у нас ещё играет роль длина потоков, что усложняет картину.
ps. То что вы показываете какие-то картинки, это все усреднение по 5-15 минут. Если у вас будет огромная пила, но с циклом меньше 5 минут, то вы увидите на таком графике прямую линию.
Я попробовал сделать hashsize меньше разумного (в версии 1.8), это не повлияло на кол-во активных потоков:
Flows: active 28398 (peak 134700 reached 4d6h18m ago), mem 2440K
Hash: size 80000 (mem 625K), metric 1.1, 1.0, 1.0, 1.0. MemTraf: 10954023 pkt, 5296876 K (pdu 33, 4005).
Flows: active 28389 (peak 134700 reached 4d6h20m ago), mem 2439K
Hash: size 200 (mem 1K), metric 117.9, 104.6, 42.3, 16.6. MemTraf: 10236885 pkt, 4925863 K (pdu 95, 8499).
Давайте уже исключим неравномерность трафика?
cat test.sh
#!/bin/bash
for id in `seq 0 10`;
do
iptables-restore < iptables-config_no_netflow
rmmod ipt_NETFLOW
modprobe ipt_NETFLOW hashsize=256 maxflows=2097152
iptables-restore < iptables-config
sleep 30
echo "$id hashsize=256 maxflows=2097152" >> test.log
cat /proc/net/stat/ipt_netflow >> test.log
iptables-restore < iptables-config_no_netflow
rmmod ipt_NETFLOW
modprobe ipt_NETFLOW hashsize=32768 maxflows=2097152
iptables-restore < iptables-config
sleep 30
echo "$id hashsize=32768 maxflows=2097152" >> test.log
cat /proc/net/stat/ipt_netflow >> test.log
done;
Трафика стало заметно меньше (около 3гбит), так что при hashsize=8192 работает адекватно, так что пришлось взять ещё более неадекватное значение hashsize=256. Вывод (позволил себе немного отформатировать):
cat test.log | grep -E "hashsize|Flows"
0 hashsize=256 maxflows=2097152
Flows: active 353799 (peak 353841 reached 0d0h0m ago), mem 58045K, worker delay 1/250.
0 hashsize=32768 maxflows=2097152
Flows: active 253874 (peak 268530 reached 0d0h0m ago), mem 41651K, worker delay 1/250.
1 hashsize=256 maxflows=2097152
Flows: active 370128 (peak 370128 reached 0d0h0m ago), mem 60724K, worker delay 1/250.
1 hashsize=32768 maxflows=2097152
Flows: active 254897 (peak 268558 reached 0d0h0m ago), mem 41819K, worker delay 1/250.
2 hashsize=256 maxflows=2097152
Flows: active 356686 (peak 356726 reached 0d0h0m ago), mem 58518K, worker delay 1/250.
2 hashsize=32768 maxflows=2097152
Flows: active 248645 (peak 266193 reached 0d0h0m ago), mem 40793K, worker delay 1/250.
3 hashsize=256 maxflows=2097152
Flows: active 357725 (peak 357725 reached 0d0h0m ago), mem 58689K, worker delay 1/250.
3 hashsize=32768 maxflows=2097152
Flows: active 248832 (peak 266820 reached 0d0h0m ago), mem 40824K, worker delay 1/250.
4 hashsize=256 maxflows=2097152
Flows: active 347253 (peak 347253 reached 0d0h0m ago), mem 56971K, worker delay 1/250.
4 hashsize=32768 maxflows=2097152
Flows: active 254756 (peak 267575 reached 0d0h0m ago), mem 41795K, worker delay 1/250.
5 hashsize=256 maxflows=2097152
Flows: active 338089 (peak 338089 reached 0d0h0m ago), mem 55467K, worker delay 1/250.
5 hashsize=32768 maxflows=2097152
Flows: active 248498 (peak 265136 reached 0d0h0m ago), mem 40769K, worker delay 1/250.
6 hashsize=256 maxflows=2097152
Flows: active 339434 (peak 339512 reached 0d0h0m ago), mem 55688K, worker delay 1/250.
6 hashsize=32768 maxflows=2097152
Flows: active 247400 (peak 266166 reached 0d0h0m ago), mem 40589K, worker delay 1/250.
7 hashsize=256 maxflows=2097152
Flows: active 340501 (peak 340501 reached 0d0h0m ago), mem 55863K, worker delay 1/250.
7 hashsize=32768 maxflows=2097152
Flows: active 247904 (peak 259526 reached 0d0h0m ago), mem 40671K, worker delay 1/250.
8 hashsize=256 maxflows=2097152
Flows: active 323601 (peak 323601 reached 0d0h0m ago), mem 53090K, worker delay 1/250.
8 hashsize=32768 maxflows=2097152
Flows: active 245044 (peak 264838 reached 0d0h0m ago), mem 40202K, worker delay 1/250.
9 hashsize=256 maxflows=2097152
Flows: active 322460 (peak 322494 reached 0d0h0m ago), mem 52903K, worker delay 1/250.
9 hashsize=32768 maxflows=2097152
Flows: active 241722 (peak 256677 reached 0d0h0m ago), mem 39657K, worker delay 1/250.
10 hashsize=256 maxflows=2097152
Flows: active 327830 (peak 327830 reached 0d0h0m ago), mem 53784K, worker delay 1/250.
10 hashsize=32768 maxflows=2097152
Flows: active 245530 (peak 260191 reached 0d0h0m ago), mem 40282K, worker delay 1/250.
Я охотно верю что у вас при небольшом количестве трафика проблема не проявляется, мы с ней тоже до данного момента ни разу не встречались. Однако - закономерность присутствует, и я совершенно не могу представить себе механизм, благодаря которому что-то может начинать неверно отрабатывать при малом значении hashsize.
Как мне кажется, дело тут даже совершенно не в нём, однако при неадекватном значении оного, что-то начинает неверно отрабатывать и пакеты из одного потока перестают "склеиваться" в один flow в памяти. Собственно это видно по выводу данных из коллектора и tcpdump(точнее, вывода tcpdump там нету, поверьте на слово): http://forum.nag.ru/forum/index.php?showtopic=53979&st=200&gopid=928350&#entry928350 где один реальный поток пользователя виден в экспорте netflow как куча потоков с малым количеством пакетов.
Взял последнюю версию из Git:
modinfo ipt_NETFLOW
filename: /lib/modules/3.12-0.bpo.1-amd64/extra/ipt_NETFLOW.ko
alias: ip6t_NETFLOW
version: v1.8-89-gac34a2d
description: iptables NETFLOW target module
author: <abc@telekom.ru>
license: GPL
srcversion: E2C8F720F147CA785FD22CB
depends: x_tables,nf_conntrack
vermagic: 3.12-0.bpo.1-amd64 SMP mod_unload modversions
parm: destination:export destination ipaddress:port (charp)
parm: inactive_timeout:inactive flows timeout in seconds (int)
parm: active_timeout:active flows timeout in seconds (int)
parm: debug:debug verbosity level (int)
parm: sndbuf:udp socket SNDBUF size (int)
parm: protocol:netflow protocol version (5, 9, 10) (int)
parm: refresh_rate:NetFlow v9/IPFIX refresh rate (packets) (uint)
parm: timeout_rate:NetFlow v9/IPFIX timeout rate (minutes) (uint)
parm: natevents:send NAT Events (int)
parm: hashsize:hash table size (int)
parm: maxflows:maximum number of flows (int)
parm: aggregation:aggregation ruleset (charp)
0 hashsize=256 maxflows=2097152
Flows: active 379864 (peak 379864 reached 0d0h0m ago), mem 62321K, worker delay 1/250.
0 hashsize=32768 maxflows=2097152
Flows: active 237551 (peak 249589 reached 0d0h0m ago), mem 38973K, worker delay 1/250.
Т.е. закономерность та же.
Попробуем для текущего трафика (3гбита) найти hashsize при котором начинается неадекват:
cat test2.sh
#!/bin/bash
for hashsize in 64 128 256 512 1024;
do
iptables-restore < iptables-config_no_netflow
rmmod ipt_NETFLOW
modprobe ipt_NETFLOW hashsize=$hashsize maxflows=2097152
iptables-restore < iptables-config
sleep 30
echo "$hashsize hashsize=$hashsize maxflows=2097152" >> test2.log
cat /proc/net/stat/ipt_netflow >> test2.log
done;
cat test2.log | grep -E "hashsize|Flows"
64 hashsize=64 maxflows=2097152
Flows: active 293412 (peak 293412 reached 0d0h0m ago), mem 48137K, worker delay 1/250.
128 hashsize=128 maxflows=2097152
Flows: active 366444 (peak 366468 reached 0d0h0m ago), mem 60119K, worker delay 1/250.
256 hashsize=256 maxflows=2097152
Flows: active 327060 (peak 327060 reached 0d0h0m ago), mem 53658K, worker delay 1/250.
512 hashsize=512 maxflows=2097152
Flows: active 332980 (peak 332980 reached 0d0h0m ago), mem 54629K, worker delay 1/250.
1024 hashsize=1024 maxflows=2097152
Flows: active 225648 (peak 226516 reached 0d0h0m ago), mem 37020K, worker delay 1/250.
При hashsize=64 загрузка CPU 100%, при этом за 30 секунд просто не успело создаться более 293412 записей.
Cпасибо за тест. Сколько была нагрузка на проц во время тестов? (Мне интересно было ли стабильно 100% при hashsize 256, если да, то причина может быть косвенной - максимальная нагрузка как-то влияет). "Поверьте на слово" - дело-то не в вере, а в сужении области поиска возможных проблем. У flowа много параметров, а по ссылке на nag отображены не все параметры, следовательно, никаких выводов сделать нельзя. "Реальный поток пользователя виден в экспорте netflow как куча потоков с малым количеством пакетов" - я такое наблюдал при низких значения таймаутов.
"hashsize при котором начинается неадекват" - можете так же вывести значения нагрузки на проц(ы)?
А вы не могли бы для этих тестов прислать мне полный лог статистики (ваш test.log
с cat /proc/net/stat/ipt_netflow
)? Можно на е-майл (он указан в README). Хочу посмотреть как меняется статистика MemTraf и остальная per CPU.
я такое наблюдал при низких значения таймаутов.
Таймауты были дефолтные - "active 1800, inactive 15". К сожалению более подробных логов не сохранилось. В принципе могу завтра попробовать повторить экперимент с tcpdump и отдельно взятым потоком.
Такс, про процессор при hashsize=256. Загрузил модуль, подождал несколько минут:
ipt_NETFLOW version v1.8-89-gac34a2d, srcversion E2C8F720F147CA785FD22CB
Flows: active 903511 (peak 903576 reached 0d0h0m ago), mem 148232K, worker delay 1/250.
Hash: size 256 (mem 2K), metric 81.65 [67.82, 35.19, 15.70]. MemTraf: 15416756 pkt, 9678868 K (pdu 18, 2133), Out 2663099 pkt, 1311869 K.
Rate: 60109150 bits/sec, 44081 packets/sec; Avg 1 min: 135851562 bps, 55457 pps; 5 min: 273233334 bps, 60628 pps
cpu# stat: <search found new [metric], trunc frag alloc maxflows>, sock: <ok fail cberr, bytes>, traffic: <pkt, bytes>, drop: <pkt, bytes>
Total stat: 17957852073 16570467 1509370 [994.25], 0 0 0 0, sock: 20195 0 20195, 28872 K, traffic: 18079837, 10733 MB, drop: 0, 0 K
cpu0 stat: 1631670181 1589494 109328 [961.47], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1698822, 1355 MB, drop: 0, 0 K
cpu1 stat: 1628389333 1527139 109344 [996.05], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1636483, 1241 MB, drop: 0, 0 K
cpu2 stat: 1698644055 1559235 104215 [1022.15], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1663450, 1252 MB, drop: 0, 0 K
cpu3 stat: 1467466119 1342845 103698 [1015.46], 0 0 0 0, sock: 20195 0 20195, 28872 K, traffic: 1446543, 1027 MB, drop: 0, 0 K
cpu4 stat: 1554085916 1415295 104200 [1023.76], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1519495, 1095 MB, drop: 0, 0 K
cpu5 stat: 1398679198 1318246 104565 [984.03], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1422811, 1044 MB, drop: 0, 0 K
cpu6 stat: 1485161855 1365761 148512 [981.77], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1514273, 681 MB, drop: 0, 0 K
cpu7 stat: 1511349465 1363109 147957 [1001.18], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1511066, 638 MB, drop: 0, 0 K
cpu8 stat: 1426712212 1292361 143387 [994.70], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1435748, 520 MB, drop: 0, 0 K
cpu9 stat: 1541185153 1389588 147000 [1003.99], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1536588, 689 MB, drop: 0, 0 K
cpu10 stat: 1354871106 1257261 144150 [967.79], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1401411, 614 MB, drop: 0, 0 K
cpu11 stat: 1259639407 1150134 143014 [975.08], 0 0 0 0, sock: 0 0 0, 0 K, traffic: 1293148, 571 MB, drop: 0, 0 K
Protocol version 5 (netflow). Timeouts: active 1800, inactive 15. Maxflows 2097152
mpstat -P ALL 2 5
Linux 3.12-0.bpo.1-amd64 (nat-10g-3) 03/27/2014 _x86_64_ (12 CPU)
04:10:24 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:10:26 AM all 0.00 0.00 0.10 0.00 0.00 89.41 0.00 0.00 10.50
04:10:26 AM 0 0.00 0.00 0.00 0.00 0.00 75.19 0.00 0.00 24.81
04:10:26 AM 1 0.00 0.00 0.00 0.00 0.00 77.93 0.00 0.00 22.07
04:10:26 AM 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:26 AM 3 0.00 0.00 0.50 0.00 0.00 82.91 0.00 0.00 16.58
04:10:26 AM 4 0.00 0.00 0.00 0.00 0.00 85.82 0.00 0.00 14.18
04:10:26 AM 5 0.00 0.00 0.83 0.00 0.00 73.33 0.00 0.00 25.83
04:10:26 AM 6 0.00 0.00 0.00 0.00 0.00 94.90 0.00 0.00 5.10
04:10:26 AM 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:26 AM 8 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:26 AM 9 0.00 0.00 0.00 0.00 0.00 98.48 0.00 0.00 1.52
04:10:26 AM 10 0.00 0.00 0.00 0.00 0.00 83.52 0.00 0.00 16.48
04:10:26 AM 11 0.00 0.00 0.00 0.00 0.00 83.62 0.00 0.00 16.38
04:10:26 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:10:28 AM all 0.00 0.00 0.05 0.00 0.00 91.66 0.00 0.00 8.29
04:10:28 AM 0 0.00 0.00 0.00 0.00 0.00 86.90 0.00 0.00 13.10
04:10:28 AM 1 0.00 0.00 0.00 0.00 0.00 83.66 0.00 0.00 16.34
04:10:28 AM 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:28 AM 3 0.00 0.00 0.00 0.00 0.00 87.06 0.00 0.00 12.94
04:10:28 AM 4 0.00 0.00 0.00 0.00 0.00 92.52 0.00 0.00 7.48
04:10:28 AM 5 0.84 0.00 0.00 0.00 0.00 74.79 0.00 0.00 24.37
04:10:28 AM 6 0.00 0.00 0.00 0.00 0.00 96.97 0.00 0.00 3.03
04:10:28 AM 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:28 AM 8 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:28 AM 9 0.00 0.00 0.00 0.00 0.00 94.85 0.00 0.00 5.15
04:10:28 AM 10 0.00 0.00 0.56 0.00 0.00 87.01 0.00 0.00 12.43
04:10:28 AM 11 0.00 0.00 0.00 0.00 0.00 85.14 0.00 0.00 14.86
04:10:28 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:10:30 AM all 0.00 0.00 0.09 0.09 0.00 90.35 0.00 0.00 9.47
04:10:30 AM 0 0.00 0.00 0.00 0.00 0.00 85.21 0.00 0.00 14.79
04:10:30 AM 1 0.00 0.00 0.00 0.00 0.00 85.62 0.00 0.00 14.38
04:10:30 AM 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:30 AM 3 0.00 0.00 0.51 0.00 0.00 87.76 0.00 0.00 11.73
04:10:30 AM 4 0.00 0.00 0.00 0.00 0.00 97.83 0.00 0.00 2.17
04:10:30 AM 5 0.00 0.00 0.00 0.00 0.00 78.95 0.00 0.00 21.05
04:10:30 AM 6 0.00 0.00 0.00 0.00 0.00 91.71 0.00 0.00 8.29
04:10:30 AM 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:30 AM 8 0.00 0.00 0.00 0.00 0.00 93.00 0.00 0.00 7.00
04:10:30 AM 9 0.00 0.00 0.51 0.00 0.00 89.23 0.00 0.00 10.26
04:10:30 AM 10 0.00 0.00 0.00 0.63 0.00 80.50 0.00 0.00 18.87
04:10:30 AM 11 0.00 0.00 0.00 0.00 0.00 86.13 0.00 0.00 13.87
04:10:30 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:10:32 AM all 0.00 0.00 0.05 0.00 0.00 89.73 0.00 0.00 10.22
04:10:32 AM 0 0.00 0.00 0.00 0.00 0.00 80.74 0.00 0.00 19.26
04:10:32 AM 1 0.00 0.00 0.00 0.00 0.00 86.33 0.00 0.00 13.67
04:10:32 AM 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:32 AM 3 0.00 0.00 0.00 0.00 0.00 90.05 0.00 0.00 9.95
04:10:32 AM 4 0.00 0.00 0.00 0.00 0.00 93.51 0.00 0.00 6.49
04:10:32 AM 5 0.00 0.00 0.00 0.00 0.00 84.55 0.00 0.00 15.45
04:10:32 AM 6 0.00 0.00 0.00 0.00 0.00 87.98 0.00 0.00 12.02
04:10:32 AM 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:32 AM 8 0.00 0.00 0.00 0.00 0.00 89.01 0.00 0.00 10.99
04:10:32 AM 9 0.00 0.00 0.00 0.00 0.00 93.75 0.00 0.00 6.25
04:10:32 AM 10 0.00 0.00 0.00 0.00 0.00 81.60 0.00 0.00 18.40
04:10:32 AM 11 0.00 0.00 0.64 0.00 0.00 80.89 0.00 0.00 18.47
04:10:32 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:10:34 AM all 0.00 0.00 0.00 0.00 0.00 91.90 0.00 0.00 8.10
04:10:34 AM 0 0.00 0.00 0.00 0.00 0.00 86.21 0.00 0.00 13.79
04:10:34 AM 1 0.00 0.00 0.00 0.00 0.00 93.10 0.00 0.00 6.90
04:10:34 AM 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:34 AM 3 0.00 0.00 0.00 0.00 0.00 89.39 0.00 0.00 10.61
04:10:34 AM 4 0.00 0.00 0.00 0.00 0.00 90.26 0.00 0.00 9.74
04:10:34 AM 5 0.00 0.00 0.00 0.00 0.00 87.25 0.00 0.00 12.75
04:10:34 AM 6 0.00 0.00 0.00 0.00 0.00 93.75 0.00 0.00 6.25
04:10:34 AM 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
04:10:34 AM 8 0.00 0.00 0.00 0.00 0.00 92.39 0.00 0.00 7.61
04:10:34 AM 9 0.00 0.00 0.00 0.00 0.00 94.87 0.00 0.00 5.13
04:10:34 AM 10 0.00 0.00 0.00 0.00 0.00 88.89 0.00 0.00 11.11
04:10:34 AM 11 0.00 0.00 0.00 0.00 0.00 80.90 0.00 0.00 19.10
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
Average: all 0.00 0.00 0.06 0.02 0.00 90.63 0.00 0.00 9.30
Average: 0 0.00 0.00 0.00 0.00 0.00 83.05 0.00 0.00 16.95
Average: 1 0.00 0.00 0.00 0.00 0.00 85.60 0.00 0.00 14.40
Average: 2 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
Average: 3 0.00 0.00 0.20 0.00 0.00 87.44 0.00 0.00 12.36
Average: 4 0.00 0.00 0.00 0.00 0.00 92.37 0.00 0.00 7.63
Average: 5 0.16 0.00 0.16 0.00 0.00 80.12 0.00 0.00 19.57
Average: 6 0.00 0.00 0.00 0.00 0.00 93.14 0.00 0.00 6.86
Average: 7 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00
Average: 8 0.00 0.00 0.00 0.00 0.00 94.99 0.00 0.00 5.01
Average: 9 0.00 0.00 0.10 0.00 0.00 94.24 0.00 0.00 5.65
Average: 10 0.00 0.00 0.12 0.12 0.00 84.44 0.00 0.00 15.33
Average: 11 0.00 0.00 0.12 0.00 0.00 83.37 0.00 0.00 16.51
лог статистики (ваш test.log с cat /proc/net/stat/ipt_netflow).
http://igorsd.ru/ipt_netflow/test.log http://igorsd.ru/ipt_netflow/test2.log
Благодарю.
Да это вам спасибо за помощь :)
Попробую на завтра оставить с hashsize=8388608 maxflows=4194304, посмотрим, может поможет. Впрочем, в любом случае, было бы здорово понять в результате чего получается рост количества потоков и отловить это дело...
Да, на всякий случай: 2хE5649 @ 2.53GHz, ядро загружено с intel_idle.max_cstate=0 processor.max_cstate=0 idle=mwait, процессоры жёстко загнаны в 2.53
Карточки
lspci | grep -i eth
03:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)
09:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection (rev 01)
по 6 прерываний на карту, каждое висит на своём ядре.
modinfo ixgbe
filename: /lib/modules/3.12-0.bpo.1-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko
version: 3.19.1
license: GPL
description: Intel(R) 10 Gigabit PCI Express Network Driver
author: Intel Corporation, <linux.nics@intel.com>
....
Даж не знаю что ещё может пригодиться.... От версии ixgbe вроде как не зависит, во всяком случае, с версией 3.13.10-k и ядром 3.11.8 я наблюдал похожую картинку.
Судя по test.log
, когда hashsize=256
, то приходит в два раза меньше пакетов (8440214 vs 16866613). Модуль физически видит меньше пакетов. Видимо они дропаются по нагрузке (видно по mpstat
что нагрузка доходит до 100%). Возможно, это потери на интерфейсах, посмотрите ifconfig -s
, ethtool -S
и netstat -s
.
Дальше, но даже с меньшим трафиком, при hashsize=256
, flows больше на 100000. При этом видно, что Out X pkt
как раз различаются на 100000. То есть при меньшей нагрузке на CPU (когда hashsize=32768) пакеты быстрее пересылаются на экспорт (уходят из хэша). Это понятно - если система перенагружена, то и экспорт происходит тоже медленнее.
Вот одну проблему выяснили: при слишком маленьком hashsize выходит нагрузка cpu 100% и экспорт замедляется увеличивая кол-во active flows.
Решение тут - не допускать перенагрузки системы, чтоб никогда не было cpu 100%. Что полезно и чтоб избежать packet drops.
Насчет вот этого
Судя по tcpdump - пользователь просто что-то заливал на сервер гугла, заливка у него не прерывалась, порты не менялись и т.п. - по идее, это должен быть один поток.
Логика экспорта отработана, наверняка там была нормальная ситуация, когда должен происходить экспорт по стандарту netflow. Условия такие:
Больше ни в каких случаях.
Видимо они дропаются по нагрузке
Скорее всего так и есть. Ещё одно наблюдение - при включении netflow с малым значением hashsize загрузка не сразу доходит до 100%, а растёт постепенно по мере накопления flow:
05:18:29 AM all 0.00 0.00 1.56 0.00 0.00 6.92 0.00 0.00 91.52
05:18:30 AM all 0.00 0.00 0.00 0.00 0.00 6.20 0.00 0.00 93.80
05:18:31 AM all 0.00 0.00 0.09 0.00 0.00 6.51 0.00 0.00 93.40
добавляем -j NETFLOW
05:18:32 AM all 0.61 0.00 0.44 0.00 0.00 7.67 0.00 0.00 91.28
05:18:33 AM all 0.00 0.00 0.00 0.00 0.00 12.27 0.00 0.00 87.73
05:18:34 AM all 0.00 0.00 0.09 0.55 0.00 16.50 0.00 0.00 82.86
05:18:35 AM all 0.00 0.00 0.00 0.00 0.00 18.65 0.00 0.00 81.35
05:18:36 AM all 0.00 0.00 0.00 0.00 0.00 23.34 0.00 0.00 76.66
05:18:37 AM all 0.00 0.00 0.00 0.00 0.00 27.57 0.00 0.00 72.43
05:18:38 AM all 0.00 0.00 0.10 0.00 0.00 34.66 0.00 0.00 65.24
05:18:39 AM all 0.00 0.00 0.00 0.00 0.00 41.96 0.00 0.00 58.04
05:18:40 AM all 0.00 0.00 0.10 0.10 0.00 45.64 0.00 0.00 54.15
05:18:41 AM all 0.00 0.00 0.00 0.00 0.00 52.87 0.00 0.00 47.13
05:18:42 AM all 0.00 0.00 0.11 0.00 0.00 60.34 0.00 0.00 39.55
05:18:43 AM all 0.00 0.00 0.00 0.00 0.00 68.24 0.00 0.00 31.76
05:18:44 AM all 0.00 0.00 0.00 0.00 0.00 78.64 0.00 0.00 21.36
05:18:45 AM all 0.00 0.00 0.10 0.00 0.00 80.21 0.00 0.00 19.69
05:18:46 AM all 0.00 0.00 0.10 0.00 0.00 86.62 0.00 0.00 13.28
05:18:47 AM all 0.00 0.00 0.00 0.00 0.00 87.76 0.00 0.00 12.24
05:18:48 AM all 0.00 0.00 0.00 0.00 0.00 88.10 0.00 0.00 11.90
05:18:49 AM all 0.00 0.00 0.00 0.00 0.00 87.71 0.00 0.00 12.29
05:18:50 AM all 0.66 0.00 1.03 0.00 0.00 89.37 0.00 0.00 8.94
удаляем -j NETFLOW
05:18:51 AM all 0.00 0.00 0.35 0.00 0.00 15.79 0.00 0.00 83.86
05:18:52 AM all 0.00 0.00 0.44 0.00 0.00 6.97 0.00 0.00 92.60
В целом оно так и должно быть по идее...
Про дропы при 100% загрузке всё понятно, тут вопросов быть не может. Не понятно что причина, а что следствие. Я выше прикладывал графики, где виден значительный рост загрузки CPU при незначительном росте трафика. Ну и при выключении ipt_netflow видно, что загрузка ядер около 45-55%. Учитывая что, как правило, netflow у нас добавлял к загрузке 10-15% вроде как производительности должно хватать за глаза, однако не хватает...
Пока мне кажется наиболее вероятным сценарием что при некотором стечении обстоятельств (недостаточный размер hashsize для текущего количества потоков), модуль в некоторых случаях генерит новые flow записи вместо использования существующих, в результате чего начинает расти нагрузка на CPU. С другой стороны не очень понятно как может быть несколько записей для одного потока, хотя, каюсь, я не программист, реализацию полностью не осилил.
Ещё одно наблюдение - при включении netflow с малым значением hashsize загрузка не сразу доходит до 100%, а растёт постепенно по мере накопления flow
Это уже не важно. Таблица потоков постепенно увеличивается. Это увеличивает нагрузку, увеличение нагрузки замедляет экспорт, от этого таблица еще больше, а это еще сильнее увеличивает нагрузку. Порочный цикл. И так пока нагрузка не станет 100% и не начнутся дропы.
Я выше прикладывал графики
К сожалению я там ничего не понял что вы хотели ими сказать - на одном графике часы, на другом дни.
Учитывая что, как правило, netflow у нас добавлял к загрузке 10-15% вроде как производительности должно хватать за глаза, однако не хватает...
Может быть закон не линейный.
модуль в некоторых случаях генерит новые flow записи вместо использования существующих
Новая запись возможна только если старая экспортнулась.
в результате чего начинает расти нагрузка на CPU.
Нагрузка цпу из-за маленькой хэш таблицы, это закон природы. Желательно, чтоб хэш таблица была не менее двух раз больше кол-ва активных потоков.
С другой стороны, всё может быть проще - при росте количества потоков в какой-то момент hashsize оказывается слишком маленьким, в результате чего растёт использование CPU. В какой-то момент появляются дропы + не успевает отрабатывать контрек. В результате - рестрансмиты и прочяя ерундистика, типа попыток ответить на уже закрытый\ещё не открытый порт и как следствие рост количества записей.
Ретрансмиты попадают в тот-же поток. Разве что в конце трансфера когда пришел rst, но это мизер пакетов.
К сожалению я там ничего не понял, что вы хотели ими сказать, на одном графике часы, на другом дни.
А я и внимание не обратил что шкала по разному отображается.... И тот и другой графики - за последние сутки.
Я ориентировался на значение entries из conntrack -S, обычно +- сотня другая тысяч оно равно количество активных flow, сейчас к примеру - entries 179312, при Flows: active 164022.
В момент когда начались проблемы - hashsize стоял 2097152, а кол-во записей в conntrack - около 1 млн.
Итого. Завтра попробую увеличить hashsize до 8388608 под нагрузкой, посмотрим как будет себя вести.
У меня на тестовой машине кол-во flows примерно равно pps.
Flows: active 18499 (peak 134700 reached 4d9h35m ago), mem 1589K Hash: size 800000 (mem 6250K), metric 1.0, 1.0, 1.0, 1.0. MemTraf: 7071257 pkt, 4980080 K (pdu 8, 1540). Rate: 67251026 bits/sec, 12752 packets/sec; Avg 1 min: 82004611 bps, 12943 pps; 5 min: 85992023 bps, 13073 pps
У нас не очень... Flows: active 177924 266472 packets/sec
При 8 гбитах практически ровно в два раза меньше получалось: Flows: active 642281 1310139 packets/sec
Уверяю вас, трафик при этом через сервер бегает примерно одинаковый +-100мбит, и реальное количество пакетов не меняется.
Чисто гипотетически, пакеты могут быть маленькими, а могут быть большими. Например, я могу nmap-ом сканировать весь Интернет, и это создаст относительно много пакетов и "соединений".
@hotid Мне рекомендуют посоветовать вам — поставить большой hashsize и maxflows, похоже у вас сервер уходит в спираль по нагрузке.
Hash: size 33554432 не особо помогает....
От чего? Вы же приводили доказательство, что изменение hashsize "помогает".
Я приводил доказательство того, что при маленьком hashsize можно иммитировать поведение модуля под высокой нагрузкой на CPU.
Будем считать что больше 8Гбит с netflow на данном железе не вытянуть. Спасибо.
С модулем\без модуля.
08:53:03 PM all 1.65 0.00 0.41 0.00 0.00 96.53 0.00 0.00 1.40
08:53:04 PM all 1.25 0.00 0.33 0.08 0.00 96.92 0.00 0.00 1.41
...
08:53:09 PM all 3.64 0.00 0.08 0.00 0.00 43.73 0.00 0.00 52.54
08:53:10 PM all 4.76 0.00 0.08 0.08 0.00 42.99 0.00 0.00 52.08
Видимо, порядка около 1млн flow - предел, после которого начинается лавинообразный рост нагрузки.
Если будет возможность по-prof-айлить, то попробуйте.
У вас выходит, что модуль удваивает нагрузку по softirq, как-то это многовато.
55.87% [kernel] [k] _raw_spin_lock
Это дает надежду, что можно ускорить, если разобраться в чем тут дело. То есть основное время тратится на lockи, а не на полезную работу.
perf report в segfault падает как только символы из ipt_NETFLOW подгружаешь...
Там как-то можно это обойти... Попробуйте perf report -g | cat
.
Не, так я пробовал - не помогает :(
Подключусь к дискуссии. Я - коллега hotid, вместе тестируем модуль под нагрузкой. К сожалению больше возможности экспериментировать на коммерческом трафике, поэтому с сервера сняли часть нагрузки и запустили Netflow.
При трафике 3.47+5.28=8.75Gb/s и 688k в Conntrack загрузка CPU была 59% При трафике 3.57+5.53=9.10Gb/s и 696k в Conntrack загрузка CPU была 100% Видимо где-то здесь предел модуля, это два соседних интервала Cacti статистики точнее к сожалению нет.
Хотим попробовать снять трафик SPANом на такой же сервер и попробовать снять Netflow для фиктивного трафика, если проблему удастся воспроизвести - появится тестовая площадка не деградирующая сервис.
Есть ли у вас предположения, почему такая проблема может возникать? Может быть имеет смысл собрать модуль без оптимизации или с -o 1? Возможно в модуле есть какие то внутренние счетчики которые переполняются?
Я думаю что при превышения какого-то уровня PPS, который для каждого железа свой - ipt_NETFLOW бОльшую часть времени начинает тратить на ожидание локов таблицы с flow, и в итоге просто не успевает обрабатывать весь трафик.
PPS в первом случае 1350,35k (726+624) PPS во втором случае 1392,98k (753+639)
Спасибо за помощь. Я не против что-нибудь оптимизировать, чтоб не было такого роста нагрузки.
Для начала надо понять где bottleneck - это может быть сложная задача. (Если появится тестовая площадка, то может быть debug+lock_stat ядро, или ядро с debuginfo+perf, perf lock, или ядро c ftrace function profiler сможет помочь понять какой именно lock перегружен, если дело в локах.)
"На ожидание локов таблицы с flow" - по идее эта таблица локов (htable_locks) и есть оптимизации для снижения нагрузки. Раньше был global lock на всю таблицу, а сейчас 256 локов выбираемых в зависимости от заголовка пакета. То есть один flow должен попадать на один и тот же лок, в то время как для одного лока другие flows маловероятны (1/256). Если у вас включен RPS, то потоки должны попадать на разные CPU, а следовательно lock contention между процессорами не будет, а следовательно spin_lock(htable_locks) не должен грузить процессор. Если RPS отключено, то возможна ситуация, что пакеты от одного потока попадают на разные процессоры параллельно и тогда spin_lock грузит процессор. Попробуйте поэкспериментировать с RPS.
Вот, для примера, были под рукой скрипты которые включают и отключают RPS:
root@z1:~# cat rps_on
#!/bin/sh
for i in /sys/class/net/eth?/queues/rx-?/rps_cpus; do
echo fff > $i
echo $i = `cat $i`
done
root@z1:~# cat rps_off
#!/bin/sh
for i in /sys/class/net/eth?/queues/rx-?/rps_cpus; do
echo 000 > $i
echo $i = `cat $i`
done
Проверить изменения можно watch -n 1 cat /proc/softirqs
. (iptables обрабатывается в softirq, а не в обычных irq, поэтому смотреть надо в /proc/softirqs, а не в /proc/interrupts.)
Возникла проблема — при включении сбора netflow с ядром 3.12-0.bpo.1-amd64 (debian) наблюдаем странную картину — количество активных потоков быстро доходит до значения Maxflows (независимо от того что прописываем в Maxflows - если 2млн, то будет около 2млн active flows, если 5 - то около 5... и hashsize), при этом все ядра CPU загружаются на 100%.
Без включения модуля загрузка сервера около 45-55%. Пробовал собирать gcc-4.6 и 4.7, версию из гита и пропатченую под 3.12 ядро версию 1.8 sf.net — поведение одинаковое.
Через пару минут после включения сбора netflow:
c hashsize=4194304 maxflows=8388608, времени проходит несколько больше, не стал дожидаться пока дойдёт до maxflows, но суть та же:
При этом
perf top с netflow:
perf top без netflow:
В контреке около 900 тыс записей, суммарный трафик проходящий через сервер — около 10гбит.
Подскажите, куда копать?