使用服务器Swap分区解决物理内存不足

demongao
2334
2020-11-03

记录一次服务器项目启动超慢,频繁宕机的问题。

物理内存不足可能引发的问题

  1. mysql查询超时, 连接超时,导致服务无法使用
Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60999, active 1, maxActive 200, creating 1, runningSqlCount 1 : SELECT.....
  1. redis连接失败
org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
  1. 项目启动慢
  2. ssh连接不上
  3. springboot: 无法执行事务回滚
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

解决方案

增加虚拟内存(swap分区),解决物理内存不够用问题.

命令:

  1. free -h: 查询内存使用情况
    image.png
  2. dd if=/dev/zero of=/var/swap bs=1024 count=8162000: 划分虚拟内存分区(大小4G),执行命令过程中无响应,需等待
  3. mkswap /var/swap: 将分区设置为swap分区
  4. swapon /var/swap: 开启swap分区
  5. cat /proc/sys/vm/swappiness:查询swap使用最大限度.
    swappiness=0: 表示最大限度使用物理内存,然后才是 swap空间;
    100:
    swappiness=100: 表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面
  6. sysctl vm.swappiness=10: [临时调整,重启后回到默认设置]将swap是想最大限度调整到10%, 内存使用到90%的时候,开始出现有Swap分区的使用.(大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整)
  7. echo 'vm.swappiness=10' >>/etc/sysctl.conf: 永久调整swap使用最大限度.`
  8. sysctl -p: 激活步骤7的设置