Linux报swap空间占用过高,但物理内存还有空余

收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用

问题分析

Swap配置对性能的影响
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,当物理内存耗尽时,可能会导致系统出问题。如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。
通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G 以下的物理内存,配置2倍的swap,4G 以上配置1倍。
另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

问题解决

swap配置优化:

控制swap使用的系统参数:swappiness,它的值的大小对如何使用swap分区是有着很大的影响。

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:

[root@swnode2 ~]# cat /proc/sys/vm/swappiness
60

也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

临时调整的方法如下,我们调成10:
[root@swnode2 ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@swnode2 ~]# cat /proc/sys/vm/swappiness
10
这只是临时调整的方法,重启后会回到默认设置的

要想永久调整的话,需要在/etc/sysctl.conf修改,加上:
[root@swnode2 ~]# cat /etc/sysctl.conf

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10

激活设置:

#sysctl -p

知识点

简单地说这个参数定义了系统对swap的使用倾向,默认值为60,值越大表示越倾向于使用swap。可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性。
通过sysctl -q vm.swappiness可以查看参数的当前设置。
修改参数的方法是修改/etc/sysctl.conf文件,加入vm.swappiness=xxx,并重起系统。这个操作相当于是修改虚拟系统中的/proc/sys/vm/swappiness文件,将值改为XXX数值。

### 如何减少Linux系统中swap内存的使用方法及优化建议 #### 调整Swappiness参数 通过修改`/proc/sys/vm/swappiness`文件中的值,可以控制内核将数据交换到swap空间的积极性。较低的swappiness值意味着更少的数据会被交换出去,从而减少了swap的使用量[^2]。 ```bash echo 10 > /proc/sys/vm/swappiness ``` 为了使更改永久生效,在`/etc/sysctl.conf`文件中添加如下行: ```text vm.swappiness=10 ``` #### 减少不必要的后台服务 关闭那些不必要且消耗大量内存的服务可以帮助降低整体内存压力,进而减少对swap的需求。可以通过`systemctl disable <service>`命令禁用不需要的服务,并重启服务器让设置生效[^1]。 #### 启用zRAM模块 Zram是一种允许创建基于RAM的设备的技术,这些设备上的页面可以在压缩状态下存储于物理随机存取存储器(RAM)之中而不是磁盘上。这样做的好处是可以显著加快访问速度并减轻硬盘I/O负担。安装和启动zRAM通常涉及加载相应的内核模块以及配置特定参数[^3]。 ```bash modprobe zram num_devices=1 echo $(( ($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE)) / (1024*1024) )) | tee /sys/block/zram0/disksize mkswap /dev/zram0 swapon /dev/zram0 ``` #### 定期监控与分析 利用工具如htop、top或smem定期查看哪些应用程序占用了最多的内存资源,以便针对性地采取措施解决问题根源所在。对于长期存在的大内存消费者考虑升级硬件或者寻找替代方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值