一、服务器基础环境

  • 服务器总内存:1.6Gi,Swap 分区:2.0Gi

  • 部署方式:1Panel + Docker Compose

  • Halo 版本:halohub/halo-pro:2.24.2

  • MySQL 版本:mysql:8.4.5

  • 部署目录:

    • Halo:/opt/1panel/apps/halo/halo

    • MySQL:/opt/1panel/apps/mysql/mysql

二、优化目标

  1. 限制 Halo 进程 JVM 堆内存,避免 Java 内存溢出占用服务器全部内存

  2. 限制 Docker 容器 CPU、物理内存资源上限,防止服务抢占系统资源

  3. 优化 MySQL 缓冲池参数,适配小内存服务器,降低数据库内存占用

三、第一次优化操作流程

# 停止Halo容器
cd /opt/1panel/apps/halo/halo
sudo docker-compose down

# 停止MySQL容器
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose down

2. 修改 Halo 配置文件(docker-compose.yml)

配置修改内容:

  1. 新增 JVM 堆内存参数:JVM_OPTS=-Xms256m -Xmx450m

  2. 容器资源限制:CPU 上限 0.5 核、内存上限 512M

networks:
  1panel-network:
    external: true
services:
  halo:
    image: halohub/halo-pro:2.24.2
    container_name: halo-pro
    restart: always
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halo_85n664?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      - --spring.r2dbc.username=root
      - --spring.r2dbc.password=Shitou521!
      - --spring.sql.init.platform=mysql
    environment:
      - JVM_OPTS=-Xms256m -Xmx450m
    volumes:
      - ./data:/root/.halo2
    ports:
      - "8090:8090"
    networks:
      - 1panel-network
    deploy:
      resources:
        limits:
          cpus: 0.5
          memory: 512M
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

3. MySQL 配置优化

MySQL 容器初始docker-compose.yml未配置资源限制

进入 MySQL 配置目录,修改my.cnf,新增 InnoDB 缓冲池参数:

[mysqld]
innodb_buffer_pool_size = 384M
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

4. 启动容器(首次启动报错修复)

启动 MySQL 时报错yaml: line 22: did not find expected '-' indicator,修正 yml 缩进语法后正常启动

# 启动MySQL
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose up -d

# 启动Halo
cd /opt/1panel/apps/halo/halo
sudo docker-compose up -d

5. 优化后内存查看

# 查看整机内存
free -h

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

MySQL 进程内存占用约 24.4%

Halo Java 进程内存占用约 18.8%

优化后整机内存占用上升至 1.2Gi,可用内存偏低,需要二次缩容优化

1. 再次停止两个服务容器

cd /opt/1panel/apps/halo/halo
sudo docker-compose down

cd /opt/1panel/apps/mysql/mysql
sudo docker-compose down

cpus: 1.0

memory: 512M

容器内存限制下调为:memory: 512M,CPU 保持 1.0核

shitou@iZ2ze6kzllv871qq54rx3lZ:/opt/1panel/apps/mysql/mysql$ cat docker-compose.yml
networks:
  1panel-network:
    external: true
services:
  mysql:
    image: mysql:8.4.5
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: Shitou521!
      TZ: Asia/Shanghai
    command:
      - --mysql-native-password=on
    volumes:
      - ./data:/var/lib/mysql
      - ./conf/my.cnf:/etc/my.cnf
      - ./log:/var/log/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - 1panel-network
    ports:
      - "3306:3306"
    deploy:
      resources:
        limits:
          cpus: 1.0
          memory: 512M

3. 重新启动容器

# 先启动MySQL
cd /opt/1panel/apps/mysql/mysql
sudo docker-compose up -d

# 再启动Halo
cd /opt/1panel/apps/halo/halo
sudo docker-compose up -d

五、优化关键说明

JVM 参数作用:-Xms为 JVM 初始堆内存,-Xmx为最大堆内存,需小于容器内存限制,预留系统开销

MySQL 优化要点:小内存服务器innodb_buffer_pool_size建议设置为物理内存的 50% 左右,本次设置 384M 适配 1.6G 服务器

YAML 报错踩坑:docker-compose.yml 对缩进严格敏感,不能使用 Tab 缩进、横线层级必须对齐,否则启动失败

两次优化原因:首次配置后整机可用内存不足,对 Halo 做小幅度缩容,平衡站点稳定性与服务器内存开销