Перейти до

FreeBSD hi loading CPU


Рекомендованные сообщения

Опубліковано: (відредаговано)

Было похожее давно, решилось блокировкой портов 6881-6889 на вход с внешки. От кучи левых DHT-соединений у ipfw nat сносило крышу, проц перегружен прерываниями, всплеск LA до 200 и падение сервера.

Что говорит "ipfw nat show" в спокойное время и перед падением сервера?

Если дело в количестве трансляций ната, то ещё можно потюнить таймауты libalias в исходниках, чтобы записи быстрее отстреливались, а не висели сутки.

У меня вообще стоит правило

ipfw add 65534 deny ip from any to any

Через внешку разрешены разве что 80 и 53, и ещё пара портов на вход, но никак не 6881-6889. На выход тоже только пара правил по определенным айпи.

У меня даже icmp не разрешено из вне.

Тут разве что делать ограничение от абонов по срц-дст айпи, что бы не было одновременных конектов овер 10000+

А ещё хорошо, как-то убить utp трафик.

Вообще замечательно было б.

Відредаговано L1ght
Ссылка на сообщение
Поделиться на других сайтах
  • Відповіді 249
  • Створено
  • Остання відповідь

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

2 KaYot    

Загалом про "сервер падає від пінгу", дуже нагадало  

это тоже пофиг. deny_in для начала ткните и посмотрите на результат.

Posted Images

Посмотрите в сторону nat global.

Возможно нагрузка растет вследствии того, что ломятся на ваш внешний айпишник, НАТ не находит в таблице трансляций записи и создает новое входжение...

Из man ipfw:

     global  Looks up translation state in all configured nat instances.  If
             an entry is found, packet is aliased according to that entry.  If
             no entry was found in any of the instances, packet is passed
             unchanged, and no new entry will be created.  See section
             MULTIPLE INSTANCES in natd(8) for more information.

Ссылка на сообщение
Поделиться на других сайтах

Правило запрещает всё. Разрешено на вход только пару портов и то они слушаются сервисами!

Дальше влючен blackhole для udp и tcp.

Ссылка на сообщение
Поделиться на других сайтах

Правило запрещает всё. Разрешено на вход только пару портов и то они слушаются сервисами!

Дальше влючен blackhole для udp и tcp.

это тоже пофиг. deny_in для начала ткните и посмотрите на результат.

Ссылка на сообщение
Поделиться на других сайтах

І у мене таке було :) 

 

Загалом це некоректна робота  LibAlias + якийсь потужний юзер торренту або вірус.

Я навіть невеликий пост про це написав, але ненашою мовою - major12.net

 

До фрібсд-шної баги вже патч є. Отже позбільшувати хеш-таблички ну і 10к сесій на айпішку тяне без проблем.

Ссылка на сообщение
Поделиться на других сайтах

Загалом по опціях kernel NAT

 

log - помагає при дебагу, дає статистику

deny_in - мастхев

unreg_only - іноді потрібне

не використовувати same_ports

і не використовувати global - бо буде шукати по всіх нат інстансах, а у мене їх наприклад 200+

Відредаговано major12
Ссылка на сообщение
Поделиться на других сайтах

І у мене таке було :)

 

Загалом це некоректна робота  LibAlias + якийсь потужний юзер торренту або вірус.

Я навіть невеликий пост про це написав, але ненашою мовою - major12.net

 

До фрібсд-шної баги вже патч є. Отже позбільшувати хеш-таблички ну і 10к сесій на айпішку тяне без проблем.

 

 

My NAT box dies when session count is near 45k

сурйозно шолі? :huh:

Ссылка на сообщение
Поделиться на других сайтах

 

Ага пошук у списочку в 45к елементів при 20-30 kpps грузить 1 ядро на 100%. Далі стає сумно.

біс вас знає, чо ви всі такі якісь нещасливі

 

znimok_ekrana_z_20140523_01_37_15.png

 

до 80-100kpps при півмульйоні трансляцій взагалі не бачу якихось драматичних проблем.

Ссылка на сообщение
Поделиться на других сайтах

Певне пост погано прочитали.

При поганій хеш функції і "поганих" вхідних значеннях, хеш таблиця вироджується в простий список. А пошук по ньому сильно неефективний.

 

При нормальному ж розподілі, сесії будуть розділятись рівномірно по таблиці і халепа наступить при 40к елементів * 4к слотів у таблиці (дефолт) = при 160 М сесій на одну айпішку (інстанс нату).

Ссылка на сообщение
Поделиться на других сайтах

Ок, а что мешает скомпилить ядро с ROUTETABLES=3\4\5\10?

Если в таблицу больше не лезет, а вроде libalias именно этими таблицами пользуется.

Ссылка на сообщение
Поделиться на других сайтах

Ок, а что мешает скомпилить ядро с ROUTETABLES=3\4\5\10?

Если в таблицу больше не лезет, а вроде libalias именно этими таблицами пользуется.

Вибачте, але це брєд  :)

Ссылка на сообщение
Поделиться на других сайтах

 

Если в таблицу больше не лезет, а вроде libalias именно этими таблицами пользуется.

:blink:

а ше казали, шо не можуть геричем розплачуватись.... вір після того людям...

Ссылка на сообщение
Поделиться на других сайтах

Кількість слотів в LibAlias тюнінгується правкою

/usr/src/sys/netinet/libalias/alias_local.h

 

У мене

#define LINK_TABLE_OUT_SIZE        40009
#define LINK_TABLE_IN_SIZE         40009
 

Ну і звичайно перекомпіляція ядра.

Ссылка на сообщение
Поделиться на других сайтах

 

Кількість слотів в LibAlias тюнінгується правкою

/usr/src/sys/netinet/libalias/alias_local.h

по логіці мало би давити pps

 

 

Ну і звичайно перекомпіляція ядра.

ну та можна й просто libalias.ko модулем перегрузити на ходу

 

Зараз граюсь з редефайнами таймінгів /usr/src/sys/netinet/libalias/alias_db.c

 

#define UDP_EXPIRE_TIME

#define TCP_EXPIRE_DEAD

#define TCP_EXPIRE_INITIAL

#define TCP_EXPIRE_CONNECTED

 

є сильна підозра, що воно просто не встигає таблички чистити тай все.

Короче кажучи, чекаю ЧНН в піддослідних жертв.

Відредаговано nightfly
Ссылка на сообщение
Поделиться на других сайтах

Тоді вже краще глянути на

 

/* Parameters used for cleanup of expired links */
/* NOTE: ALIAS_CLEANUP_INTERVAL_SECS must be less then LINK_TABLE_OUT_SIZE */
#define ALIAS_CLEANUP_INTERVAL_SECS  64
#define ALIAS_CLEANUP_MAX_SPOKES     (LINK_TABLE_OUT_SIZE/5)
 

А таймаути tcp/udp я би не чіпав.

Хоча той же лінукс розділяє UDP на UNREPLIED і ESTABLISHED що ніби трохи правильніше.

 

При нормальному розподілі воно ітак витягне 160М сесій, навіщо чистити.

Ссылка на сообщение
Поделиться на других сайтах

 

 

Кількість слотів в LibAlias тюнінгується правкою

/usr/src/sys/netinet/libalias/alias_local.h

по логіці мало би давити pps

pps не задавиш. Прийшло 100к пакетів і піти має 100к. І так наприклад кожну 1 секунду.

От коли не вистачить проца - тоді ппс і просяде.

 

А от оперативки такий тюнінг розміру табличок, в 10 раз більше зжере :)

 

 

/* NOTE: ALIAS_CLEANUP_INTERVAL_SECS must be less then LINK_TABLE_OUT_SIZE */

на те як-би й натякав.

Старий я вже, не встигаю тайпати :D

Ссылка на сообщение
Поделиться на других сайтах

 

pps не задавиш. Прийшло 100к пакетів і піти має 100к. І так наприклад кожну 1 секунду.

нісагласєн - більша таблиця / повільніший пошук по хешах. Дешевше чистити рєзче.

 

 

А от оперативки такий тюнінг розміру табличок, в 10 раз більше зжере :)

значить симметрично треба крутити усілякі нмбкластерс

Ссылка на сообщение
Поделиться на других сайтах

 

 

pps не задавиш. Прийшло 100к пакетів і піти має 100к. І так наприклад кожну 1 секунду.

нісагласєн - більша таблиця / повільніший пошук по хешах. Дешевше чистити рєзче.

 

 

Точно точно.

 

Більша хеш таблиця == швидший пошук, за рахунок меншої кількості елементів в 1 слоті.

По таблиці пошук не йде. Там 1 раз виконується функція яка визначає номер слоту (фактично індекс у масиві). А далі звертання до М[0] чи до M[100500] відбувається за той самий час.

 

В маленькій таблиці в 1 слот попаде 10 елементів і треба буде ще пошукати в списку з 10 елементів.

В великій таблиці в 1 слот попаде 1-2 елементи. Якщо 1 елемент, то берем його зразу. Якщо 2 - то або вгадали або перескакуємо на наступний елемент списку і берем його.

Ефективно !

 

Платимо оперативкою, купуємо швидкодію.

Ссылка на сообщение
Поделиться на других сайтах

Может кот посмотрит, снимал WireShark-ом с внешнего интерфейса. 3 файла, 1 - во время падения, 2 - перезагрузка и снова падение. 3 - перезагрузка и все заработало.

sos.zip

Відредаговано BARVIT
Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

  • Схожий контент

    • Від a_n_h
      Всем доброго дня и мирного неба!
        После многочисленных экспериментов выяснил, что на последних версиях freebsd  максимум удавалось прокачать до 14 ГБт суммарно трафика со 100% загрузкой процессора. На том-же железе но с установленной freebsd 11.2 прокачивается до 20-ти ГБт суммарно тестового трафика с загрузкой процессора около 50%. 
        Подскажите, что можно убрать или наоборот добавить в систему с freebsd 13,3 для получения аналогичного результата...
    • Від mac
      Здається, після оновлення PHP 7.4 до PHP 8.2 feesharvester припинив працювати:
       
      /usr/local/bin/curl "http://127.0.0.1/billing/?module=remoteapi&key={SERIAL}&action=feesharvester" <br /> <b>Fatal error</b>: Uncaught TypeError: Unsupported operand types: string - string in {UBPATH}/billing/api/libs/api.fundsflow.php:570 Stack trace: #0 {UBPATH}/billing/modules/remoteapi/feesharvester.php(22): FundsFlow-&gt;harvestFees('2024-01') ...  
      Невеличке розслідування врешті з'ясувало, що це через наявність пробілу у деяких логінах абонентів. Як так сталося? Тому що інколи був неуважно додан трейлінг пробіл до номеру будинка і цей пробіл потрапив до логіну абоненту. Логін абоненту неможливо змінити ніяким чином штатними засобами. Я не розглядаю створення нового абонента для усунення помілки.

      Був обран такий шлях вирішення проблеми. Заміну функції php explode() знайшов у мережі. Мабуть це станеться в нагоді:

       
      diff api.fundsflow.php.bak api.fundsflow.php.new 559c559 < $eachfee = explode(' ', $eachline); --- > $eachfee = preg_split("~(?<!\\\\)(?:\\\\{2})*'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(*SKIP)(*F)|\s+~s" , $eachline);  
    • Від FantoM_EscapE
      Хочу перенести свій білінг NODENY із фізичного сервера на віртуальний. Шукаю адміна який зможе допомогти у цьому питанні, так як нашого адміна банально призвали до війська. Вся схема на даний момент робоча, маю доступи до всього. Потрібно проінсталити на новішу версію FREEBSD, бо на моїй 10 річній вже не працюють нові SSL сертифікати. Кого зацікавила дана пропозиція - прошу у приватні повідомлення. обсудимо ціну і строки. або пишіть на будь-який месенджер 0677792091
    • Від rusol
      Добрый вечер.
       
      Есть от провайдера блок реальных адресов, к примеру 100.1.1.192/26
       
      Раньше сеть была в одном влане и записи в /etc/rc.conf были такие:

       
      ifconfig_ix0="inet 192.168.0.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP ifconfig_ix0_alias0="inet 100.1.1.193 netmask 255.255.255.192" # Шлюз для пользователей с реальными IP  
      После чего стала задача часть пользователей переводить во вланы тоже с разделением на локальные IP и реальные, первый влан создал где-то пару лет назад и все работает:
       
      ifconfig_vlan1="vlan 1 vlandev ix0 192.168.1.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP во Влане 1 ifconfig_vlan1_alias0="inet 100.1.1.248 netmask 255.255.255.248" # Шлюз для пользователей с реальными IP  во Влане 1  
      И вот стоит задача создать еще один влан, делаю по аналогии с вланом 1, только маску смещаю назад:
       
      ifconfig_vlan2="vlan 2 vlandev ix0 192.168.1.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP во Влане 2 ifconfig_vlan2_alias0="inet 100.1.1.246 netmask 255.255.255.254" # Шлюз для пользователей с реальными IP во Влане 2  
      Когда я внес это в /etc/rc.conf и прописал команду:
       
      ifconfig vlan2 create  
      Все заработало.
       
      Но как только перезагрузился сервер, перестали работать реальные IP без вланов, в первом влане и во втором. Не пойму что не так делаю, возможно я с маской подсети что-то недопонимаю...
    • Від rusol
      Добрый вечер.
       
      Есть от провайдера блок реальных адресов, к примеру 100.1.1.192/26
       
      Раньше сеть была в одном влане и записи в /etc/rc.conf были такие:

       
      ifconfig_ix0="inet 192.168.0.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP ifconfig_ix0_alias0="inet 100.1.1.193 netmask 255.255.255.192" # Шлюз для пользователей с реальными IP  
      После чего стала задача часть пользователей переводить во вланы тоже с разделением на локальные IP и реальные, первый влан создал где-то пару лет назад и все работает:
       
      ifconfig_vlan1="vlan 1 vlandev ix0 192.168.1.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP во Влане 1 ifconfig_vlan1_alias0="inet 100.1.1.248 netmask 255.255.255.248" # Шлюз для пользователей с реальными IP  во Влане 1  
      И вот стоит задача создать еще один влан, делаю по аналогии с вланом 1, только маску смещаю назад:
       
      ifconfig_vlan1="vlan 1 vlandev ix0 192.168.1.1 netmask 255.255.255.0" # Шлюз для пользователей с локальным IP во Влане 2 ifconfig_vlan1_alias0="inet 100.1.1.246 netmask 255.255.255.254" # Шлюз для пользователей с реальными IP во Влане 2  
      Когда я вношу это в /etc/rc.conf и прописал команду:
       
      ifconfig vlan2 create  
      Все заработало.
       
      Но как только перезагрузился сервер, перестали работать реальные IP без вланов, в первом влане и во втором. Не пойму что не так делаю, возможно я с маской подсети что-то недопонимаю...

×
×
  • Створити нове...