物理内存:
当在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 分区,只需要执行以下几个步骤。
- 分区:不管是 fdisk 命令还是 parted 命令,都需要先区。
- 格式化:格式化命令稍有不同,使用 mkswap 命令把分区格式化成 swap 分区。
- 使用 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 — 进程名称(命令名/命令行)