Linux云服务器故障排查(内存优化)

1. 内存占用

  • 执行 top 命令查看系统的实时负载,进入 top 的实时界面后,默认按照 CPU 的使用率排序
  • 通过 shift + m 按键将进程按照内存使用情况从大到小排序

2. Mysql 内存优化

1
2
3
4
5
6
7
MySQL 在启动的时候,会占用一部分的内存来作为缓冲区,这样做的原因是可以优化查询速度,我们可以发现只要查询过一次 MySQL,
然后用相同的语句再次查询,第二次查询会比第一次更快,这其中就用到了 MySQL 自身的缓存系统。

MySQL 的缓存机制是当某一个连接访问某张表时,MySQL 会先检查访问的表是否在缓存区中,如果这张表已经在缓存区中打开,
那就会直接访问缓存区从而加快查询速度,如果这张表不在缓存区,那就会从实际的数据库文件进行查询,然后再把这张表加入缓存区,以便后续查询加快速度。

由于这个机制我们的 MySQL 在运行过程占用的内存会逐渐增加,而本系统查询频率并不多,我们要做的就是去掉 MySQL 用来加快查询的各种机制。

2.1 修改 my.cnf

  • 可以使用 mysql --help | grep 'my.cnf' 来查看默认加载的 my.cnf 目录,排序前的优先
  • 使用vim打开排在第一个的my.cnf,加入如下内容:
    1
    2
    3
    4
    table_open_cache=200
    table_definition_cache=400
    performance_schema_max_table_instances=400
    performance_schema=off
  • 重启 MySQL:
    1
    service mysqld restart

3. Java 内存优化

3.1 规定内存大小

可以在 tomcat /bin 目录下的 catalina.sh,设置 JAVA_OPTS 参数规定运行时内存使用情况。
因为 tomcat 容器里的 java 都是一些小项目和 demo,用不着分配这么多内存,所以只需分配很小内存即可。

1
JAVA_OPTS="$JAVA_OPTS -Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m"

参数详解:

  • Xms:Java 虚拟机堆区内存初始内存分配的大小
  • Xmx:Java 虚拟机堆区内存初始内存分配的最大上限
  • Xmn:Java 虚拟机堆区内存初始内存分配的最小值
  • XX:PermSize:非堆区初始化内存分配大小
  • XX:MaxPermSize:非堆区分配的内存的最大上限
  • XX:MaxNewSize:新生代可被分配的内存的最大上限

3.2 回收 buffer/cache

  • 创建脚本 cleanCache.sh
  • 添加内容:
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    echo "开始清除缓存"
    sync;sync;sync # 写入硬盘,防止数据丢失
    sleep 10 # 延迟10秒
    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
  • 打开权限:
    1
    chmod +x cleanCache.sh
  • 打开定时任务配置文件
    1
    crontab -e # 弹出配置文件
  • 添加定时任务,每两小时执行一次
    1
    2
    # 分  时  日  月  周  命令
    0 */2 * * * ./cleanCache.sh
  • 设置 crond 启动以及开机自启
    1
    2
    systemctl start crond.service
    systemctl enable crond.service
  • 查看定时任务是否被执行
    1
    cat /var/log/cron | grep cleanCache