> 记录一次服务器项目启动超慢,频繁宕机的问题。
# 物理内存不足可能引发的问题
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.....
```
2. 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
```
3. 项目启动慢
4. ssh连接不上
5. springboot: 无法执行事务回滚
```
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
```
# 解决方案
增加虚拟内存(swap分区),解决物理内存不够用问题.
## 命令:
1. `free -h`: 查询内存使用情况
![image.png](https://cdn.demongao.com/halo/image_1604368159191.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的设置
使用服务器Swap分区解决物理内存不足