Linux系统设置swap大小,创建swap,top虚拟内存,VIRT RES SH

文章详细介绍了Linux系统中物理内存和swap分区的工作原理,包括内存如何被使用、释放以及如何通过`sync`和`drop_caches`命令手动清理缓存。还讨论了`swappiness`参数对内存使用的影响,以及如何调整这一参数以优化系统性能。此外,文中提到了监控系统状态的关键命令`top`和`free`,以及如何处理内存不足和swap分区的管理,包括创建和释放swap分区的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

物理内存:
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching,

因此很有必要手动清理系统缓存释放内存。
1.先执行sync,先把buffe中的数据先写入到硬盘中。
2.输入手动释放内存的命令
echo 3 > /proc/sys/vm/drop_caches
drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
然后我们可以执行 free -m,先观察到内存已经被释放


SAWP分区使用率
 原理:
控制swap使用的系统参数:swappiness
Swappiness:表示使用物理内存限度
Swappiness为0(100%-0=100%)表示物理内存使用到100%的时候使用swap空间(这种风险太高,因为swap分配空间本来就很小,容易触发OOM)
Swappiness为60(100%-60%=40%)表示物理内存使用到40%的时候使用swap空间,默认值是60,对应的配置文件是/proc/sys/vm/swappiness
如果swappiness设置太大(内存的速度会比磁盘快很多),这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,
所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
如SAWP分区使用率过高:
1.使用TOP命令查看进程分析是什么进程占用内存使用率过高

解决思路
1.首先明白是什么导致的内存使用率过高,如果是应用进程使用率过高就联系开发由开发提供解决方案,可能是内存泄漏等
2.如应用进程使用率不高,那么需要释放swap分区,在释放swap分区之前必须必须要确保服务器物理内存剩余使用率高于目前swap分区已使用的内存量
(如剩余物理内存还有10G,swap分区总共3G,已使用2G,那么释放swap分区后剩余物理内存可用值是8G)

3.释放swap分区操作命令
  (1)查看swap分区挂载的文件系统路径 swapon -s (默认都是/dev/dm-1)
  (2)关闭sqap分区 swapoff /dev/dm-1(该过程其实就是释放自身内存到物理内存,比较慢,释放2G大约要6分钟时间,期间可以另起一个窗口,执行top命令查看swap分区释放的进度值)
  (3) swapon -s 如果查询不到挂载点,表示已经全部释放到物理内存
  (4) swapon /dev/dm-1 重新把交换分区挂载上去,实际分配的总内存和释放前是一样的,已使用的内存清零
   (5)swapon -s查看是否挂载上去

或者可以用以下两个命令清除刷新swap
swapoff -a
swapon -a

一、swap概念&设置大小参考值

  •         当Linux系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
  • 直接从内存读写数据要比从硬盘读写数据快得多,因此更希望所有数据的读取和写入都在内存中完成,然而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称 swap 空间)
  • 作为物理内存的扩展,Linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样一来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存
     
  • 要深入了解 Linux 内存运行机制,需要知道下面提到的几个方面:

            首先,Linux 系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不用的内存页面,因为这样可以大大节省等待交换所需的时间。
            其次,Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux 内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存

  • 最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。

  • 因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,但大致遵循这样一个基本原则:
            如果内存较小(根据经验,物理内存小于 4GB),一般设置 swap 分区大小为内存的 2 倍;
            如果物理内存大于 4GB,而小于 16GB,可以设置 swap 分区大小等于物理内存;
             如果内存大小在 16GB 以上,可以设置 swap 为 0,但并不建议这么做,因为设置一定大小的 swap 分区是有一定作用的。
     

  • Linux swap分区及作用详解
    在安装系统的时候已经建立了 swap 分区。swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。也就是说,当内存不够用时,我们使用 swap 分区来临时顶替。这种“方式应用于几乎所有的操作系统中。

  • 使用 swap 交换分区,显著的优点是,通过操作系统的调度,应用程序实际可以使用的内存空间将远远超过系统的物理内存。由于硬盘空间的价格远比 RAM 要低,因此这种方式无疑是经济实惠的。当然,频繁地读写硬盘,会显著降低操作系统的运行速率,这也是使用 swap 交换分区最大的限制。

相比较而言,Windows 不会为 swap 单独划分一个分区,而是使用分页文件实现相同的功能,在概念上,Windows 称其为虚拟内存,从某种意义上将,这个叫法更容易理解。因此,初学者将 swap 交换分区理解为虚拟内存是没有任何问题的。

  • 建立新的 swap 分区,只需要执行以下几个步骤。

    1. 分区:不管是 fdisk 命令还是 parted 命令,都需要先区。
    2. 格式化:格式化命令稍有不同,使用 mkswap 命令把分区格式化成 swap 分区。
    3. 使用 swap 分区。

  • 实验制作硬盘:
第一种方式正式硬盘
/dev/sdb1

第二种方式:模拟
[root@git tmp]# dd if=/dev/zero of=/swapfile1 bs=1024 count=1194304
  • 格式化成 swap 分区,所以格式化命令是 mkswap
    [root@git tmp]# mkswap /swapfile1 
    mkswap: /swapfile1: insecure permissions 0644, 0600 suggested.
    Setting up swapspace version 1, size = 1.1 GiB (1222963200 bytes)
    no label, UUID=19bb79fe-afe0-4884-b4a3-aff81d888e66

  • 在使用 swap 分区之前,了解下free 命令。命令如下:
[root@git tmp]# free 
              total        used        free      shared  buff/cache   available
Mem:       16209528     7762164     2220608      310916     6226756     8026240
Swap:       8278012       21380     8256632
  • free 命令主要是用来查看内存和 swap 分区的使用情况的,其中:
    • total:是指总数;
    • used:是指已经使用的;
    • free:是指空闲的;
    • shared:是指共享的;
    • buffers:是指缓冲内存数;
    • cached:是指缓存内存数,单位是KB;

      解释:
      buffers(缓冲)和 cached(缓存)的区别。简单来讲,cached 是给读取数据时加速的,buffers 是给写入数据加速的。cached 是指把读取出来的数据保存在内存中,当再次读取时,不用读取硬盘而直接从内存中读取,加速了数据的读取过程;buffers 是指在写入数据时,先把分散的写入操作保存到内存中,当达到一定程度后再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程。
  • 我们已经看到,在加载进新的 swap 分区之前,swap 分区的大小是8278012MB,接下来只要加入 swap 分区就可以了,使用命令 swapon。命令格式如下:

[root@CncLucZK ~]# swapon 分区设备文件名
#将新的 swap 分区sdb1加入到现在的swap 分区
[root@localhost ~]# swapon /dev/sdb1
或

立即激活 /swapfile1交换文件

[root@git tmp]# swapon /swapfile1
swapon: /swapfile1: insecure permissions 0644, 0600 suggested.


再次查看
[root@git tmp]# free 
              total        used        free      shared  buff/cache   available
Mem:       16209528     7763592     2217236      310920     6228700     8026796
Swap:       9472312       21380     9450932


或
[root@git tmp]# cat /proc/swaps 
Filename				Type		Size	Used	Priority
/dev/dm-1                               partition	8278012	21380	-2
/swapfile1                              file		1194300	0	-3

swap交换分区变城了:9472312

  • 如果想让 swap 分区开机之后自动挂载,就需要修改 /etc/fstab 文件,命令如下:

#blkid /dev/sdb1查找设备的UUID
vim /etc/fstab

/swapfile1 swap swap defaults 0 0

vim /etc/sysctl.conf增加以下内容
vm.swappiness=10
  • linux什么时候开始使用虚拟内存(swap)?
[root@git tmp]# cat /proc/sys/vm/swappiness 
30

上面这个30代表物理内存在使用30%的时候才会使用swap

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,

swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
 

B.修改swappiness参数

临时性修改:

[root@wenwen ~]# sysctl vm.swappiness=10

vm.swappiness = 10

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

10

永久性修改:

[root@wenwen ~]# vim /etc/sysctl.conf

加入参数:

vm.swappiness = 35

然后在直接:

[root@wenwen ~]# sysctl -p

查看是否生效:

cat /proc/sys/vm/swappiness

35


 

 

  • 怎么释放内存?

   一般系统是不会自动释放内存的

关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches

  • 怎么释放swap?

前提:首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。

a.查看当前swap分区挂载在哪?

[root@git tmp]# 
[root@git tmp]# swapon  -s
Filename				Type		Size	Used	Priority
/dev/dm-1                              	partition	8278012	7028	-3
/swapfile1                             	file    	1194300	0	-2

b.关停这个分区

[root@git tmp]# swapoff /dev/dm-1

 c.查看状态:

[root@git tmp]# swapon -s
Filename				Type		Size	Used	Priority
/swapfile1                             	file    	1194300	0	-2

d.查看swap分区是否关停,最下面一行显示全0

[root@git tmp]# swapoff /dev/dm-1 
[root@git tmp]# free -lh
              total        used        free      shared  buff/cache   available
Mem:           15Gi       7.4Gi       2.1Gi       315Mi       6.0Gi       7.6Gi
Low:           15Gi        13Gi       2.1Gi
High:            0B          0B          0B
Swap:         1.1Gi          0B       1.1Gi

e.将swap挂载到/dev/xxxx上

[root@git tmp]# swapon /dev/dm-1 

f.查看挂载是否成功
[root@git tmp]# swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-1                              	partition	8278012	0	-3
/swapfile1                             	file    	1194300	0	-2

查看大小
[root@git tmp]# free -lh
              total        used        free      shared  buff/cache   available
Mem:           15Gi       7.4Gi       2.1Gi       315Mi       6.0Gi       7.6Gi
Low:           15Gi        13Gi       2.1Gi
High:            0B          0B          0B
Swap:         9.0Gi          0B       9.0Gi
  • 一些实际的小例子?

我在设置mysql的时候,将my.cnf文件

innodb_buffer_pool_size = 6G(我操作系统的内存就是6G,一般这个值设置为操作系统内存的80%)

这个值并不是设置的越大越好。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率。

这里你可以这么理解,当我将这个buffer_pool_size设置得过大,跟操作系统内存一样大的时候,我使用mysql,会在一段时间内调用大量的数据进内存,由于linux的内存机制,再根据最近最优的原则,将一部分数据筛选放入swap分区,而swap分区没有及时的清理掉数据,当再次调用其它数据的时候,又会将一部分数据筛选放入swap分区,可能会出现一个现象,就是物理内存还有剩余,甚至是空的,而swap分区却是满的。

我们只需要努力,然后剩下的交给时间。
 

 

TOP

一、命令介绍

Linux系统可以通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息。通过top命令可以有效的发现当前系统存在的问题,是否存在内存不够、CPU处理能力不够、IO读写过高,以方便我们随时监控系统健康状况,并及时做出补救措施。

[root@git tmp]# top
top - 16:26:15 up 202 days, 22:35,  3 users,  load average: 0.49, 0.34, 0.35
Tasks: 473 total,   2 running, 471 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.9 us,  0.2 sy,  0.0 ni, 98.4 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15829.6 total,   2142.7 free,   7597.8 used,   6089.0 buff/cache
MiB Swap:   9250.3 total,   9229.4 free,     20.9 used.   7822.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                             
 634515 gitlab-+  20   0 4232820  41676  34028 S   4.3   0.3   2651:16 postgres                                                                            
 634405 git       20   0 2751128   1.1g  26936 S   3.6   7.0  25738:56 bundle                                                                              
 634331 gitlab-+  20   0   85892  28172   3580 S   2.3   0.2   8487:00 redis-server                                                                        
 634348 git       20   0 2557596  69320  19360 S   2.0   0.4 994:24.35 gitaly                                                                              
 634335 git       20   0  282204  50368  10912 S   1.7   0.3   3385:07 gitlab-exporter                                                                     
1922372 git       20   0 1646908 984.2m  10360 S   1.0   6.2   0:27.68 bundle                                                                              
 634300 git       20   0 1535728 967288  22428 S   0.7   6.0 317:06.17 bundle                                                                              
 634341 gitlab-+  20   0 2251332  41456  16968 S   0.3   0.3 297:04.18 alertmanager                                                                        
 634421 git       20   0 2972008  89756  16156 S   0.3   0.6 714:45.69 ruby                                                                                
1922850 git       20   0 1646972 986.7m  10424 S   0.3   6.2   0:25.37 bundle                                                                              
1923334 git       20   0 1646908 980.0m  10360 S   0.3   6.2   0:25.00 bundle                                                                              
1978109 root      20   0   65820   5176   4000 R   0.3   0.0   0:00.03 top                                                                                 
      1 root      20   0  238736  11244   7996 S   0.0   0.1   2:03.25 systemd                                                                             
      2 root      20   0       0      0      0 S   0.0   0.0   0:05.97 kthreadd                                                                            
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                              
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                               

第一行:

top - 16:26:15 up 202 days, 22:35,  3 users,  load average: 0.49, 0.34, 0.35

依次对应:系统当前时间, up系统到目前为止运行的时间, 当前登陆系统的用户数量, load average 后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。

load average 数据是每隔5秒钟检查一次活跃的进程数然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量结果高于5的时候就表明系统在超负荷运转了。
 

第二行:(进程数据)

Tasks: 473 total,   2 running, 471 sleeping,   0 stopped,   0 zombie

依次对应:tasks表示任务(进程),240 total则表示现在有240个进程,其中处于运行中的有2个,238个在休眠(挂起),stopped状态即停止的进程数为0,zombie状态即僵尸的进程数为0个。

第三行:(CPU数据)

%Cpu(s):  0.9 us,  0.2 sy,  0.0 ni, 98.4 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st

依次对应:

us: user 用户空间占用cpu的百分比

sy: system 内核空间占用cpu的百分比

ni: niced 改变过优先级的进程占用cpu的百分比

id:空闲cpu百分比

wa: IO wait IO等待占用cpu的百分比

hi: Hardware IRQ 硬中断 占用cpu的百分比

si: software 软中断 占用cpu的百分比

st: 被hypervisor偷去的时间
 

第四行:(内存数据)

MiB Mem :  15829.6 total,   2142.7 free,   7597.8 used,   6089.0 buff/cache

依次对应:

物理内存总量,空闲内存总量,  使用中的内存总量 ,缓冲缓存内存量,单位是KB。

第五行:(swap交换分区)

MiB Swap:   9250.3 total,   9229.4 free,     20.9 used.   7822.8 avail Mem 

依次对应:

交换区总量(9G),空闲交换区总量(9G),使用的交换区总量(20.9MB),可用交换取总量,

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
 

第六行:(进程资源占用情况)

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND 

依次对应:

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,精确到1/100秒,例如68:11.92则表示程序已运行68分11.92秒。

COMMAND — 进程名称(命令名/命令行)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值