Linux限流靠精准资源控制而非堆机器:用cgroups限CPU/内存、tc限网络带宽、iptables+hashlimit防连接滥用、ulimit控进程数,核心是划清边界保障关键服务。

Linux系统限流不是靠加机器,而是靠精准控制资源使用——关键在于不让某个服务或用户吃光CPU、内存、网络带宽或连接数,从而保住核心服务不被拖垮。
用cgroups限制进程资源(CPU/内存)
cgroups是内核级的资源隔离机制,适合长期运行的服务(如数据库、Java应用)。v2版本更简洁,推荐启用:
- 确认系统使用cgroup v2:mount | grep cgroup,看到cgroup2即表示已启用
- 创建限流目录:sudo mkdir -p /sys/fs/cgroup/db-limited
- 限制CPU使用率不超过50%:echo "50000" > /sys/fs/cgroup/db-limited/cpu.max(单位为万分之一,50000=50%)
- 限制内存上限为2G:echo "2147483648" > /sys/fs/cgroup/db-limited/memory.max
- 将目标进程加入该组:echo PID > /sys/fs/cgroup/db-limited/cgroup.procs
建议配合systemd服务定义使用(如MemoryMax=2G、CPUQuota=50%),重启服务后自动生效,更可靠。
用tc做网络出口限速(防带宽打满)
当某服务突发大量外发流量(如日志推送、文件下载接口),可用tc在网卡层面限速,保护其他服务的网络响应。
- 清空原有规则:tc qdisc del dev eth0 root 2>/dev/null
- 添加HTB队列,总出口限100Mbps:tc qdisc add dev eth0 root handle 1: htb default 30
- 为特定端口(如9001)单独限速5Mbps:tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit
- 匹配并分流流量:tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dport 9001 0xffff flowid 1:1
注意:tc规则不持久,建议写入/etc/network/if-up.d/脚本或用systemd-networkd服务固化。
用iptables+hashlimit防连接滥用(抗简单CC)
对HTTP API或SSH等入口服务,限制单IP连接频次,可快速缓解低强度扫描和暴力尝试。
- 每秒最多新建3个TCP连接(针对80/443端口):iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 3/sec --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name http_limit -j DROP
- 同时记录触发行为便于排查:iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 3/sec --hashlimit-mode srcip -j LOG --log-prefix "RATE_LIMIT_DROP: "
- 保存规则(Debian/Ubuntu):iptables-save > /etc/iptables/rules.v4
注意:hashlimit按源IP哈希计数,轻量高效;但不能替代WAF,仅作为第一道防线。
用ulimit控制用户级进程数量(防fork炸弹)
普通用户误执行:(){ :|:& };:这类fork炸弹会迅速耗尽PID数,导致系统无法创建新进程。需提前设防:
- 临时限制当前会话:ulimit -u 512(最大用户进程数)
- 永久生效:在/etc/security/limits.conf中添加:
* soft nproc 512
* hard nproc 1024 - 对关键用户(如www-data)单独收紧:www-data soft nproc 200
搭配pam_limits.so启用(默认已启用),登录后自动加载,无需重启服务。
限流不是压性能,而是划边界——让非核心任务有约束,核心路径有余量。配置后务必用stress-ng、ab或真实流量验证效果,避免过度限制反伤可用性。










