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握手超时
排查步骤:
  1. 立刻查看有SYN_SENT/SYN_RECV连接的目标IP/端口(确认是来自SLB还是Redis还是OSS)
    ss -ant state SYN-SENT
    ss -ant state SYN-RECV
    
  2. 立刻检查对应目标服务的状态(如果是Redis/OSS,进入云控制台检查;如果是SLB,检查SLB的健康检查状态)
  3. 立刻检查对应目标服务的防火墙/安全组/白名单(如果是Redis/OSS,进入云控制台检查;如果是SLB,检查SLB的后端服务器组的白名单)
  4. 如果是SYN_RECV,立刻检查是否有SYN泛洪攻击(用netstat/ss看SYN_RECV的数量是否在短时间内激增,用tcpdump抓包看SYN包的来源IP是否大量是随机IP)
  5. 可以使用以下命令实时监控这个数值的变化:(如果长期小于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"

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐