From d32fdefcb323fe32d6685bf91f5fd24188103b1e Mon Sep 17 00:00:00 2001 From: Sergey Matveev <stargrave@stargrave.org> Date: Sun, 25 Feb 2024 00:05:03 +0300 Subject: [PATCH] =?utf8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0?= =?utf8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20?= =?utf8?q?=D0=B2=20libalias?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=253912 У Ð¼ÐµÐ½Ñ Ð±Ñло много пÑоблем Ñ Ð½Ð°Ð³ÑÑзкой на CPU в моÑм ipfw: f8e2e4dfc6870c4dad7e62be9bb02ae9dd73d180. ÐÑÑ Ð¶ÑÑко ÑилÑно ÑпиÑалоÑÑ Ð² NAT, а ÑоÑнее libalias ÑеализаÑиÑ, иÑполÑзÑемÑÑ Ð² ipfw. Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ñнова ÑазбиÑалÑÑ Ð²Ð¾ вÑÑм ÑÑом, ибо Ñ Ð¼ÐµÐ½Ñ Xeon ÑовÑеменнÑй, а Ñ Ð½ÐµÐ³Ð¾ половина ÑеÑÑÑÑов занÑÑа ÑеÑÑÑ, а ÑоÑнее libalias-ом. УвеÑеннее, Ñже ÑеÑлекÑоÑно ÑÑал вводил "netstat -Q" (пÑоÑмоÑÑ Ð¾ÑеÑедей netisr (kernel network dispatch service)), "top -aSH" (где Ð²Ð¸Ð´Ð½Ñ ÐºÐ¾Ð½ÐºÑеÑнÑе ÑдеÑнÑе модÑли оÑнимаÑÑие ÑеÑÑÑÑÑ), "vmstat -m" (ÑÐ°Ð·Ð¼ÐµÑ Ð¿Ð°Ð¼ÑÑи оÑведÑнной Ð´Ð»Ñ libalias Ñам виден), "vmstat -i" (видеÑÑ ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÑеÑÑваний по ÑдÑам). ÐÑÑаÑлÑÑ Ñже, ибо вÑÑ Ð¾Ð´Ð¸Ð»Ð¾ Ñак, ÑÑо Ð²Ð¾Ñ Ð½Ñ Ð½Ð¸ Ð¼Ð¾Ð¶ÐµÑ FreeBSD вÑжаÑÑ NAT Ð´Ð»Ñ 100Mbps инÑеÑÑейÑа, за коÑоÑÑм вÑего 1.5 маÑÐ¸Ð½Ñ Ð¿Ð¾ ÑÑÑи (одна Ñ BitTorrent акÑивнÑм, а вÑоÑÐ°Ñ ÑÑо мой компÑÑÑеÑ, иногда ÑаÑами ниÑего не дÑÑгаÑÑего из IPv4 ÐнÑеÑнеÑа). Ðо наÑÑлÑÑ bug по ÑÑÑлке, Ñ Ð¿Ð°ÑÑем, ÑозданнÑй еÑÑ Ð¿Ð°ÑÑ Ð»ÐµÑ Ð½Ð°Ð·Ð°Ð´. РникÑо его не мÑÑÐ¶Ð¸Ñ Ð½Ð¸ÐºÑда. ÐÑоÑло паÑа ÑаÑов -- полÑÑ Ð¾ÑлиÑнейÑий. Ðа пÑоÑеÑÑоÑе ÑÐ¼ÐµÑ Ð¾ÑвоÑнÑе неÑколÑко пÑоÑенÑов одного ÑдÑа макÑимÑм ÑепеÑÑ (и ÑÑо firewall, NAT и AQM). While lookup of outgoing packets uses hash based on both source and destination address, for incoming packets only alias address and port is used. So when multiple connections from different addresses target the same port of redirected address (using redirect_addr or redirect_port in IPFW), the link table must be searched sequentially - tens of thousand of items for every incoming packet. To make it worse, the search is under a lock, so it is forced to run on a single core. Consequently just 1000pps from different addresses are enough to bring down a server with the fastest CPU available in under a minute. ÐÑÑм Ð²Ð¾Ñ ÑиÑÑаÑÐ¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ как Ñ Ð¼ÐµÐ½Ñ, ÑоÑÑ-в-ÑоÑÑ. Ð Ð²ÐµÐ´Ñ ÑÐ°Ð¼Ð°Ñ Ð¾Ð±ÑÑÐ½Ð°Ñ Ð±Ð°Ð½Ð°Ð»ÑÐ½Ð°Ñ Ð´Ð¾Ð¼Ð°ÑнÑÑ. Ðак-бÑдÑо кÑайне Ñедко и мало кÑо Ñ Ð½ÐµÐ¹ вÑÑÑеÑаеÑÑÑ. ÐÐ¾Ñ ÑÑÑ Ñо и можно Ð±Ñ Ð±Ñло ÑказаÑÑ ÑÑо FreeBSD не Ð´Ð»Ñ Ð´Ð¾Ð¼Ð°. Ðо неÑ, вÑего Ñо маленÑкий паÑÑик нÑжен. -- 2.51.0