Linux 服务器运维调优1
·
1、systemd服务常用命令
#刷新配置
sudo systemctl daemon-reload
#允许服务开机自动启动
sudo systemctl enable shop.service
#禁止开机启动
sudo systemctl disable shop.service
#启动
sudo systemctl start shop.service
#停止
sudo systemctl stop shop.service
#重启
sudo systemctl restart shop.service
#查看状态
sudo systemctl status shop.service
#查看所以有 dx开头服务
systemctl list-unit-files | grep -i dx
systemctl list-units --type=service --all 'yyjb*' --no-pager --no-legend 2>&1
#要停止所有 dxjb开头服务
sudo systemctl stop $(systemctl list-unit-files | grep -o "^dx[^ ]*.service")
校验d x.service文件配置准确性:
#验证所有实例的启动日志是否正常
sudo journalctl -u shop.service -n 50 --no-pager
# 查看 systemd 版本
systemctl --version
# 验证配置文件语法
sudo systemd-analyze verify /etc/systemd/system/dx.service
2、linux 服务器设置Swap
# 1. 创建 6GiB 的 Swap 文件(/swapfile)
sudo fallocate -l 6G /swapfile
# 如果 fallocate 不支持,用 dd(慢一点但稳):
# sudo dd if=/dev/zero of=/swapfile bs=1G count=6
# 2. 设置权限(必须,否则安全风险)
sudo chmod 600 /swapfile
# 3. 格式化为 Swap
sudo mkswap /swapfile
# 4. 启用 Swap
sudo swapon /swapfile
# 5. 永久生效(加到 /etc/fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 6. 验证(看 Swap 行是否有值)
free -h
3、linux运行过程中连接情况
#服务器调优
# 1. 查看所有TCP连接的状态统计(包括ESTABLISHED和所有non_established)
ss -ant | awk 'NR>1 {s[$1]++} END {for(k in s) print k"\t"s[k]}'
# 2. 查看前10个TIME_WAIT连接的目标IP/端口(确认是来自SLB还是Redis还是OSS)
ss -ant state TIME-WAIT | head -n 10
# 3. 查看是否有CLOSE_WAIT连接(1个以上就要立刻排查!)
ss -ant state CLOSE-WAIT
# 4. 查看是否有SYN_SENT/SYN_RECV连接(1个以上就要立刻排查!)
ss -ant state SYN-SENT
ss -ant state SYN-RECV
有CLOSE_WAIT连接(1个以上!立刻排查!)
1) 立刻查看对应.NET8应用实例的启动日志(找对应目标IP/端口的异常日志
# 假设对应目标IP/端口是Redis的6379
sudo journalctl -u dx-* --since "1 hour ago" --no-pager | grep -i "redis"2)立刻查看对应.NET8应用实例的线程堆栈(找应用逻辑卡死的地方)
# 用dotnet-dump查看对应.NET8应用实例的线程堆栈
dotnet-dump collect --process-id <对应.NET8应用实例的PID>
dotnet-dump analyze <生成的dump文件路径>
# 或者用dotnet-trace查看对应.NET8应用实例的线程堆栈(生产环境推荐!不用dump大文件!)
dotnet-trace collect --process-id <对应.NET8应用实例的PID> --duration 00:00:30 --output <生成的trace文件路径>
dotnet-trace convert <生成的trace文件路径> --format speedscope
有SYN_SENT/SYN_RECV连接(1个以上!立刻排查!)
根因锚定:
- 如果是SYN_SENT:对应目标服务(Redis/OSS)挂了或者防火墙/安全组/白名单没放开
- 如果是SYN_RECV:SYN泛洪攻击或者您的SLB握手超时
排查步骤:
- 立刻查看有SYN_SENT/SYN_RECV连接的目标IP/端口(确认是来自SLB还是Redis还是OSS)
ss -ant state SYN-SENT ss -ant state SYN-RECV- 立刻检查对应目标服务的状态(如果是Redis/OSS,进入云控制台检查;如果是SLB,检查SLB的健康检查状态)
- 立刻检查对应目标服务的防火墙/安全组/白名单(如果是Redis/OSS,进入云控制台检查;如果是SLB,检查SLB的后端服务器组的白名单)
- 如果是SYN_RECV,立刻检查是否有SYN泛洪攻击(用netstat/ss看SYN_RECV的数量是否在短时间内激增,用tcpdump抓包看SYN包的来源IP是否大量是随机IP)
- 可以使用以下命令实时监控这个数值的变化:(如果长期小于50就是正常的)
watch -n 1 "netstat -an | grep SYN_RECV | wc -l"
4、优化您的Linux系统的TIME_WAIT相关参数
/etc/sysctl.conf
# 🔴 电商API必加的TIME_WAIT优化参数
# 允许TIME_WAIT状态的连接被复用(给新的SYN连接用)
net.ipv4.tcp_tw_reuse = 1
# 快速回收TIME_WAIT状态的连接(Linux默认关闭,但对单台多实例的电商API来说可以开)
net.ipv4.tcp_tw_recycle = 1
# 把TIME_WAIT的时间从默认的1分钟改到30秒(Linux 3.2+支持)
net.ipv4.tcp_fin_timeout = 30
# 把本地端口范围从默认的32768-60999改到1024-65535(留足更多的本地端口给TCP连接用)
net.ipv4.ip_local_port_range = 1024 65535
# 把TCP最大SYN队列长度从默认的128改到1024-4096之间(留足突发峰值的SYN队列冗余)
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
添加完成后,执行以下命令生效:
# 重载sysctl配置
sudo sysctl -p
# 验证配置是否生效
sudo sysctl -a | grep -i "tw_reuse\|tw_recycle\|fin_timeout\|local_port_range\|somaxconn\|tcp_max_syn_backlog"
更多推荐


所有评论(0)