化学显存和虚拟显存
我们晓得,直接从数学显存读写数据要比从硬碟读写数据要快的多,为此,我们希望所有数据的读取和写入都在显存完成,而显存是有限的,这样就引出了数学显存与虚拟显存的概念。
化学显存就是系统硬件提供的显存大小,是真正的显存,相对于化学显存,在linux下还有一个虚拟显存的概念,虚拟显存就是为了满足数学显存的不足而提出的策略,它是借助c盘空间虚拟出的一块逻辑显存,用作虚拟显存的c盘空间被称为交换空间(SwapSpace)。
作为化学显存的扩充,linux会在化学显存不足时,使用交换分区的虚拟显存,更详尽的说,就是内核会将暂时不用的显存块信息讲到交换空间,这样以来,数学显存得到了释放,这块显存就可以用于其它目的,当须要用到原始的内容时,这种信息会被重新从交换空间读入化学显存。
linux的显存管理采取的是分页存取机制,为了保证化学显存能得到充分的借助,内核会在适当的时侯将化学显存中不时常使用的数据块手动交换到虚拟显存中,而将常常使用的信息保留到化学显存。
要深入了解linux显存运行机制,须要晓得下边提及的几个方面:
首先,Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲化学显存,虽然并没有哪些事情须要显存,Linux也会交换出暂时不用的显存页面。这可以防止等待交换所需的时间。
其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟显存,linux内核依据”最近最常常使用“算法,仅仅将一些不时常使用的页面文件交换到虚拟显存,有时我们会看见如此一个现象:linux化学显存还有好多,并且交换空间也使用了好多。似乎,这并不奇怪,比如,一个占用很大显存的进程运行时,须要花费好多显存资源,此时都会有一些不常用页面文件被交换到虚拟显存中,但后来这个占用好多显存资源的进程结束并释放了好多显存时,刚刚被交换出去的页面文件并不会手动的交换进化学显存,除非有这个必要,这么此刻系统数学显存都会空闲好多,同时交换空间也在被使用,就出现了刚刚所说的现象了。关于这点,不用担忧哪些,只要晓得是怎样一回事就可以了。
最后,交换空间的页面在使用时会首先被交换到化学显存linux服务器性能监控,假如此时没有足够的数学显存来容纳那些页面,它们又会被马上交换出去,这么以来,虚拟显存中可能没有足够空间来储存这种交换页面,最终会造成linux出现假死机、服务异常等问题,linux其实可以在一段时间内自行恢复,并且恢复后的系统早已基本不可用了。
为此,合理规划和设计linux显存的使用,是极其重要的。
判定显存够不够用的标准是要综合化学显存和swap去判定,首先要看化学显存占有量是否很大,假如化学显存占用量很大,而且被用尽,而交换分区也用的特别大,也使用50%-60%,这就说明显存紧张了,或则交换分区常年处于使用率较高,这就可能出现很大的频繁的换入换出,这样说明显存可能会有不足。
显存的监控
作为一名linux系统管理员,监控显存的使用状态是十分重要的linux 下载,通过监控有助于了解显存的使用状态,例如显存占用是否正常linux服务器性能监控,显存是否短缺等等,监控显存最常使用的命令有free、top等,下边是某个系统free的输出:
[root@localhost ~]# free
total used free shared buffers cached
Mem: 16402432 16360492 41940 0 465404 12714880
-/+ buffers/cache: 3180208 13222224
Swap: 8193108 264 8192844
我们解释下输出结果中每位选项的含意:
首先是第一行:
total:化学显存的总大小。used:早已使用的数学显存多小。free:空闲的数学显存值。shared:多个进程共享的显存值。buffers/cached:c盘缓存的大小。
第二行Mem:代表化学显存使用情况。
第三行(-/+buffers/cached):代表缓存使用状态。
第四行:Swap表示交换空间显存使用状态。
free命令输出的显存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。
1.从内核的角度来查看显存的状态total-used=free
就是内核目前可以直接分配到,不须要额外的操作,即为里面free命令输出中第二行Mem项的值,可以看出,此系统数学显存有16G,空闲的显存只有41940K,也就是40M多一点,我们来做一个这样的估算:
16402432-16360492=41940
虽然就是总的数学显存除以早已使用的数学显存得到的就是空闲的数学显存大小,注意这儿的可用显存值41940并不包含处于buffers和cached状态的显存大小。
假如你觉得这个系统空闲显存太小,那你就错了,实际上,内核完全控制着显存的使用情况,linux会在须要显存的时侯,或在系统运行逐渐加快时,将buffers和cached状态的显存变为free状态的显存,以供系统使用。
2.从应用层的角度来看系统显存的使用状态free+buffer/cached
也就是linux上运行的应用程序可以使用的显存大小,即free命令第三行“(-/+buffers/cached)”的输出,可以见到,此系统早已使用的显存才3180208K,而空闲的显存达到13222224K,继续做这样一个估算:
41940+(465404+12714880)=13222224
通过这个方程可知,应用程序可用的化学显存值是Mem项的free值加上buffers和cached值之和,也就是说,这个free值是包括buffers和cached项大小的,
对于应用程序来说,buffers/cached占有的显存是可用的,由于buffers/cached是为了增强文件读取的性能,当应用程序须要用到显存的时侯,buffers/cached会很快地被回收,以供应用程序使用。
buffer和cache也是真实的数学显存。
通过内核角度去查看空闲显存,假如空闲显存较多,那很显著,这台机器是显存特别空闲的,并且假如从内核层面看见的free显存小的话,并不代表显存不足,还要综合看buffer/cache,假如这个值也十分小,这样才才能说明显存确实不足了。
buffers与cached的优缺
在Linux操作系统中,当应用程序须要读取文件中的数据时,操作系统先分配一些显存,将数据从c盘读入到这种显存中,之后再将数据分发给应用程序;当须要往文件中写数据时,操作系统先分配显存接收用户数据,之后再将数据从显存讲到c盘上。但是,假若有大量数据须要从c盘读取到显存或则由显存写入c盘时,系统的读写性能就显得十分低下,由于无论是从c盘读数据,还是写数据到c盘,都是一个很消耗时间和资源的过程,在这些情况下,linux引入了buffers和cached机制。
buffers与cached都是显存操作,拿来保存系统以前打开过的文件以及文件属性信息,这样当操作系统须要读取个别文件时,会首先在buffers与cached显存区查找,假如找到,直接读出传送给应用程序,假如没有找到须要数据,才从c盘读取,这就是操作系统的缓存机制,通过缓存,大大提升了操作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是拿来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及trackingin-flightpages,而cached是拿来给文件做缓冲。更浅显一点说:buffers主要拿来储存目录上面有哪些内容,文件的属性以及权限等等。而cached直接拿来记忆我们打开过的文件和程序。
为了验证我们的推论是否正确,可以通过vi打开一个特别大的文件红旗linux5.0,瞧瞧cached的变化,之后再度vi这个文件,觉得一下两次打开的速率有何优缺,是不是第二次打开的速率显著快于第一次呢?
接着执行下边的命令:
find/*-name*.conf
瞧瞧buffers的值是否变化,之后重复执行find命令,瞧瞧两次显示速率有何不同。
Linux操作系统的显存运行原理,很大程度上是按照服务器的需求来设计的,比如系统的缓冲机制会把常常使用到的文件和数据缓存在cached中,linux总是在力求缓存更多的数据和信息,这样再度须要这种数据时可以直接从显存中取,而不须要有一个漫长的c盘操作,这些设计思路提升了系统的整体性能。
在查看显存占用率的时侯,或则查看显存资源是否充足的时侯,把握一点就行了,通过free命令,buffer+cahce+free是应用程序可以使用的。这个很小说明显存不足了,很大说明是没有问题的。
交换空间swap的使用
在系统负载的高峰期,因为忽然的显存占用过大使得影响业务。
尽管如今的显存早已显得十分廉价,而且swap一直有很大的使用价值,合理的规划和使用swap分区,对系统稳定运行至关重要。Linux下可以使用文件系统中的一个常规文件或则一个独立分区作为交换空间使用。同时linux容许使用多个交换分区或则交换文件。
创建swap交换空间
创建交换空间所需的交换文件是一个普通的文件,而且,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须坐落本地硬碟上,不能在网路文件系统(NFS)上创建swap交换文件。诸如:
[root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536
65536+0 records in
65536+0 records out
这样就创建一个有连续空间的交换文件,大小为60M左右,关于dd命令做简单的述说:
if=输入文件,或则设备名称。
of=输出文件或则设备名称。
ibs=bytes表示一次读入bytes个字节(即一个块大小为bytes个字节)。
obs=bytes表示一次写bytes个字节(即一个块大小为bytes个字节)。
bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可取代ibs和obs。
count=blocks仅拷贝blocks个块。
skip=blocks表示从输入文件开头跳过blocks个块后再开始复制。
seek=blocks表示从输出文件开头跳过blocks个块后再开始复制。(一般只有当输出文件是c盘或磁带时才有效)
这儿的输入设备/dev/zero代表一个输出永远为0的设备文件,使用它作输入可以得到全为空的文件。
激活和使用swap
首先通过mkswap命令指定作为交换空间的设备或则文件:
[root@localhost ~]#mkswap /data/swapfile
Setting up swapspace version 1, size = 67104 kB
[root@localhost backup]# free
total used free shared buffers cached
Mem: 2066632 1998188 68444 0 26160 1588044
-/+ buffers/cache: 383984 1682648
Swap: 4088500 101036 3987464
从里面输出可知,我们指定了一个67104kB的交换空间,而此时新建的交换空间还未被使用,下边简单介绍下mkswap命令,mkswap的通常使用格式为:
mkswap[参数][设备名称或文件][交换区大小]
参数:
-c:构建交换区前,先检测是否有破损的区块。
-v0:构建新式交换区,此为预设值。
-v1:构建旧式交换区。
交换区大小:指定交换区的大小,单位为1024字节。
设置交换分区后,接着通过swapon命令激活swap:
[root@localhost ~]#/usr/sbin/swapon /data/swapfile
[root@localhost backup]# free
total used free shared buffers cached
Mem: 2066632 1997668 68964 0 27404 1588880
-/+ buffers/cache: 381384 1685248
Swap: 4154028 100976 4053052
通过free命令可以看出,swap大小早已由4088500k变为4154028k,相差的值是60M左右,正好等于我们降低的一个交换文件大小,这说明新增的交换分区早已可以使用了,而且假如linux重启,这么新增的swap空间将显得不可用,因而须要在/etc/fstab中添加手动加载设置:
/data/swapfile none swap sw 0 0
这么以来,linux在重启后就可以实现手动加载swap分区了。虽然linux在启动过程中会执行“swapon-a”命令,此命令会加载列在/etc/fstab中的所有交换空间。
移除swap
通过swapoff即可移除一个交换空间
[root@localhost ~]#/usr/sbin/swapoff /data/swapfile
虽然也可以通过“swapoff-a”移除在/etc/fstab中定义的所有交换空间,这儿的“swapoff-a”与前面提及的“swapon-a”对应。执行“swapoff-a”后,free命令输出如下:
[root@localhost backup]# free
total used free shared buffers cached
Mem: 2066632 2048724 17908 0 30352 1642748
-/+ buffers/cache: 375624 1691008
Swap: 0 0 0
如何释放swap?
前提:首先要保证显存剩余要小于等于swap使用量,否则会宕机!按照显存机制,swap分区一旦释放,所有储存在swap分区的文件就会转存到化学显存上。一般通过重新挂载swap分区完成释放swap。
a.查看当前swap分区挂载在哪?b.取缔这个分区c.查看状态:d.查看swap分区是否取缔,最下边一行显示全e.将swap挂载到/dev/sda5上f.查看挂载是否成功
查看进程占用显存
在了解了Linux中显存的管理机制后,才能依据显存的状态去判定系统显存资源非常短缺,而且有时侯要对一些进程占用的显存资源进行剖析,而单独的一个linux命令并不能很清楚的展示进程占用的显存资源状态,所以,须要有个管理工具来获取每位进程的显存资源占用情况,这对Linux运维来说,至关重要,下边给出一个生产环境中检测系统显存占用情况的脚本,脚本内容如下:
#!/bin/bash
echo -e `date +%Y-%m-%d %H:%M`
echo -e "PIDttMEMttProc_Name"
# 找到/proc目录下所有以数字为名的目录
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
do
if [ $pid -eq 1 ];then continue;fi
grep -q "VmRSS" /proc/$pid/status 2>/dev/null
if [ $? -eq 0 ];then
mem=$(grep VmRSS /proc/$pid/status
| gawk '{ sum+=$2;} END{ print sum }')
proc_name=$(ps aux | grep -w "$pid" | grep -v grep
| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
if [ $mem -gt 0 ];then
echo -e "${pid}t${mem}t${proc_name}"
fi
fi
done | sort -k2 -n | awk -F't' '{
pid[NR]=$1;
size[NR]=$2;
name[NR]=$3;
}
END{
for(id=1;id<=length(pid);id++)
{
if(size[id]<1024)
printf("%-10stsKBt%sn",pid[id],size[id],name[id]);
else if(size[id]<1048576)
printf("%-10st.2fMBt%sn",pid[id],size[id]/1024,name[id]);
else
printf("%-10st.2fGBt%sn",pid[id],size[id]/1048576,name[id]);
}
}'
[root@localhost app]# pwd
/app
[root@localhost app]# ls
check_mem.sh
[root@localhost app]# chmod 755 check_mem.sh
[root@localhost app]# ./check_mem.sh
执行结果类似如下:
PID MEM Proc_Name
21137 35.41MB nginx: master process /usr/local/nginx/sbin/nginx
21145 81.82MB nginx: worker process
21143 81.89MB nginx: worker process
21144 81.90MB nginx: worker process
21140 81.91MB nginx: worker process
21138 82.07MB nginx: worker process
21142 82.09MB nginx: worker process
21139 82.14MB nginx: worker process
21141 82.50MB nginx: worker process
其中,MEM列就是每位进程目前占用的显存情况,由此可见,通过此脚本,可以清晰的看见每位进程占用显存资源状态,这儿对于运维人员来说,十分有用。