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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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

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

swappiness100的时候表示积极的使用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状态即停止的进程数为0zombie状态即僵尸的进程数为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 — 进程名称命令名/命令行
 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux