Linux服务器运维:那些让人崩溃的AI服务部署问题

最近在Linux服务器上部署AI服务,遇到了各种问题。权限、端口、进程管理、日志排查,这些看起来简单的问题,实际处理起来还挺麻烦的。今天就把我遇到的问题和解决方案都记录下来,给需要的同学参考。
在这里插入图片描述

问题1:服务启动失败,但不知道为啥

这是最让人崩溃的问题。服务启动失败,日志也没看出来原因。

排查方法

# 1. 检查服务状态
systemctl status my-ai-service

# 2. 看详细日志
journalctl -u my-ai-service -n 100 --no-pager

# 3. 实时查看日志
journalctl -u my-ai-service -f

# 4. 如果systemd没有日志,看应用自己的日志
tail -f /var/log/ai-service/application.log

# 5. 检查端口占用
netstat -tlnp | grep 8080
# 或者
ss -tlnp | grep 8080

# 6. 检查进程
ps aux | grep java

常见原因

  1. 端口被占用
# 找到占用端口的进程
lsof -i :8080
# 或者
fuser 8080/tcp

# 杀掉进程
kill -9 $(lsof -t -i:8080)
  1. 权限问题
# 检查文件权限
ls -la /opt/ai-service/

# 修复权限
chmod +x /opt/ai-service/start.sh
chown -R appuser:appuser /opt/ai-service/
  1. 依赖缺失
# Java应用检查Java版本
java -version

# Python应用检查依赖
pip list | grep tensorflow

问题2:内存不足,服务被OOM Kill

AI服务很吃内存,经常被OOM Kill。

检查OOM

# 查看系统日志,找OOM记录
dmesg | grep -i "out of memory"
# 或者
journalctl -k | grep -i "out of memory"

# 查看内存使用
free -h

# 查看进程内存
ps aux --sort=-%mem | head -20

解决方案

  1. 增加swap(临时方案):
# 创建swap文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效,加到/etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  1. 限制进程内存(systemd):
# /etc/systemd/system/ai-service.service
[Service]
MemoryLimit=4G
MemoryHigh=3G
  1. 优化JVM参数(Java应用):
# 设置堆内存
java -Xms2g -Xmx4g -jar app.jar

# 或者在systemd服务里
ExecStart=/usr/bin/java -Xms2g -Xmx4g -jar /opt/ai-service/app.jar

问题3:服务突然挂了,没有自动重启

生产环境服务必须自动重启。

systemd自动重启配置

# /etc/systemd/system/ai-service.service
[Unit]
Description=AI Service
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/ai-service
ExecStart=/usr/bin/java -jar /opt/ai-service/app.jar
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

# 资源限制
MemoryLimit=4G
CPUQuota=200%

[Install]
WantedBy=multi-user.target
# 重载配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start ai-service

# 设置开机自启
sudo systemctl enable ai-service

# 检查状态
sudo systemctl status ai-service

Supervisor配置(如果不用systemd)

# /etc/supervisor/conf.d/ai-service.conf
[program:ai-service]
command=/usr/bin/java -jar /opt/ai-service/app.jar
directory=/opt/ai-service
user=appuser
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/ai-service/error.log
stdout_logfile=/var/log/ai-service/out.log
environment=JAVA_HOME="/usr/lib/jvm/java-17"

问题4:日志文件太大,磁盘满了

AI服务日志量大,很快就占满磁盘。

解决方案

  1. 日志轮转(logrotate)
# /etc/logrotate.d/ai-service
/var/log/ai-service/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 appuser appuser
    sharedscripts
    postrotate
        systemctl reload ai-service > /dev/null 2>&1 || true
    endscript
}
  1. 应用层日志配置(Logback):
<!-- logback-spring.xml -->
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/ai-service/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>/var/log/ai-service/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>7</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>
  1. 清理旧日志脚本
#!/bin/bash
# cleanup-logs.sh
find /var/log/ai-service -name "*.log" -mtime +7 -delete
find /var/log/ai-service -name "*.log.gz" -mtime +30 -delete
# 加到crontab
0 2 * * * /opt/scripts/cleanup-logs.sh

问题5:模型文件下载慢

AI服务的模型文件很大,下载很慢。

解决方案

  1. 用wget断点续传
wget -c https://example.com/models/large-model.bin
  1. 用aria2多线程下载
# 安装aria2
sudo apt install aria2

# 多线程下载
aria2c -x 16 -s 16 https://example.com/models/large-model.bin
  1. 用rsync从其他服务器同步
rsync -avz --progress user@source-server:/path/to/models/ /opt/ai-service/models/
  1. 预下载到本地,再上传
# 本地下载后,用scp上传
scp model.bin user@server:/opt/ai-service/models/

问题6:Nginx反向代理配置

AI服务通常要用Nginx做反向代理。

Nginx配置

# /etc/nginx/sites-available/ai-service
upstream ai_backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081 backup;  # 备用服务
}

server {
    listen 80;
    server_name ai.example.com;

    # 重定向到HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ai.example.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    # 日志
    access_log /var/log/nginx/ai-service-access.log;
    error_log /var/log/nginx/ai-service-error.log;

    # 超时设置(AI服务可能很慢)
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;

    # 请求体大小限制
    client_max_body_size 100M;

    location / {
        proxy_pass http://ai_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket支持(如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 健康检查
    location /health {
        proxy_pass http://ai_backend/health;
        access_log off;
    }
}

问题7:防火墙配置

服务器防火墙要开放端口。

UFW配置

# 查看状态
sudo ufw status

# 开放端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp

# 允许特定IP访问
sudo ufw allow from 192.168.1.0/24 to any port 8080

# 启用防火墙
sudo ufw enable

firewalld配置

# 查看状态
sudo firewall-cmd --state

# 开放端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp

# 重载配置
sudo firewall-cmd --reload

实用脚本

一键部署脚本

#!/bin/bash
# deploy.sh

set -e

SERVICE_NAME="ai-service"
SERVICE_DIR="/opt/ai-service"
SERVICE_USER="appuser"

echo "Deploying $SERVICE_NAME..."

# 1. 停止服务
systemctl stop $SERVICE_NAME || true

# 2. 备份旧版本
if [ -d "$SERVICE_DIR" ]; then
    mv $SERVICE_DIR $SERVICE_DIR.backup.$(date +%Y%m%d_%H%M%S)
fi

# 3. 创建目录
mkdir -p $SERVICE_DIR
chown $SERVICE_USER:$SERVICE_USER $SERVICE_DIR

# 4. 复制文件
cp target/app.jar $SERVICE_DIR/
cp config/* $SERVICE_DIR/config/

# 5. 设置权限
chmod +x $SERVICE_DIR/app.jar
chown -R $SERVICE_USER:$SERVICE_USER $SERVICE_DIR

# 6. 启动服务
systemctl start $SERVICE_NAME

# 7. 检查状态
sleep 5
if systemctl is-active --quiet $SERVICE_NAME; then
    echo "Deployment successful!"
else
    echo "Deployment failed!"
    systemctl status $SERVICE_NAME
    exit 1
fi

监控脚本

#!/bin/bash
# monitor.sh

SERVICE_NAME="ai-service"
LOG_FILE="/var/log/ai-service/monitor.log"

check_service() {
    if ! systemctl is-active --quiet $SERVICE_NAME; then
        echo "$(date): Service $SERVICE_NAME is down, restarting..." >> $LOG_FILE
        systemctl restart $SERVICE_NAME
    fi
}

check_disk() {
    DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ $DISK_USAGE -gt 80 ]; then
        echo "$(date): Disk usage is ${DISK_USAGE}%, cleaning logs..." >> $LOG_FILE
        find /var/log/ai-service -name "*.log" -mtime +7 -delete
    fi
}

check_memory() {
    MEMORY_USAGE=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
    if [ $MEMORY_USAGE -gt 90 ]; then
        echo "$(date): Memory usage is ${MEMORY_USAGE}%" >> $LOG_FILE
    fi
}

check_service
check_disk
check_memory
# 加到crontab,每分钟检查一次
* * * * * /opt/scripts/monitor.sh

总结

Linux服务器部署AI服务,主要问题:

  1. 排查问题:用好日志和系统工具
  2. 资源管理:内存、CPU、磁盘都要监控
  3. 自动重启:systemd或Supervisor
  4. 日志管理:日志轮转,避免占满磁盘
  5. 网络配置:防火墙、Nginx反向代理

运维是个细致活,很多问题都是小细节,但处理不好就会影响服务。关键是建立好的监控和自动化流程。

更多推荐