赞
踩
linux的体系架构,从宏观来看分为 内核态和用户态
用户态和内核态的切换:
系统调用的一般过程:
用户态和内核态的知识架构图整理:
linux内存类型分类有物理内存和虚拟内存
在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),== 不会释放其占用内存 ==,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
可以理解就是尽可能的使用内存空间。实际上面的机制是linux的buffers/cache机制。
linux系统通过分页的方式管理内存空间。 内存空间被划分为一系列连续的页,当程序运行时,将程序数据加载到内存中运行。
程序运行结束之后,并不一定会立刻释放内存,已加载的页面一般通过“最近最少使用”算法管理,将不使用的页cache到内存中。
所以通过top或free命令,查看内存管理的内存使用情况时,一直会发现内存使用量占用的很高的状态。因为这个是cache原理才会造成这个现象。而cache的空间通过内存管理,可以是被释放和重用的。(至于哪些cache可以被释放哪些不可以,后续再专门研究)
问题思考:
通过free查看物理内存还有很大空间,而swap空间也有使用的,这个是可能的原因?
1、某个时间执行了一个大程序或多个程序 ,系统内存不够用,使用的虚拟内存swap空间。
2、程序运行结束,因为cache机制,这些加载的页面没有被立刻换出内存空间,所以会占用。
3、swap空间的使用量,统计的是历史最大使用情况。 当swap空间在一段时间内频繁变化时,这个就是系统内存使用不足了。
虚拟内存swap空间创建步骤
1.检查swap文件是否存在,返回空则不存在 swapon -s 2.查看文件系统,检查空间是否足够创建swap df -hal 3.创建一个swap目录 mkdir /swap 4.创建并允许swap文件 dd if=/dev/zero of=/swap/swapfile bs=1024 count=4096000 5.格式化swap文件 mkswap -f /swap/swapfile 6.激活swap swapon /swap/swapfile 7.设置开机启动(vim 打开 /etc/fstab) /swap/swapfile swap swap defaults 0 0 8.赋予Swap文件适当的权限 chown root:root /tmp/swapfile chmod 600 /tmp/swapfile 9.查看swappiness权重(swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间,swappiness=100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。) cat /proc/sys/vm/swappiness 10.临时修改swappiness sysctl vm.swappiness=10 11.要永久设置修改swappiness vim /etc/sysctl.conf 12.在这个文档的最后加上这样一行 # Search for the vm.swappiness setting. Uncomment and change it as necessary. vm.swappiness=10 13.查看内存使用情况
swap空间一般分配的大小
根据swap空间使用原理,其实swap分配大小为内存的2倍的黄金法则,在现代计算机可能不适用了。 因为现在计算机的RAM大小可达到128GB等等的。
根据系统主要的使用情况动态调整才是最好的。
网络上整理了一些建议:
可以做参考,并非一定要这么做。
如果根据Red Hat的建议,他们建议是分配RAM 20%的换空间,也就是RAM是8GB,分配1.6GB交换空间。
CentOS建议
如果RAM小于2GB,就分配和RAM同等大小的Swap交换空间。
如果RAM大于2GB,就分配2GB交换空间
Ubuntu考虑到系统需要休眠,
如果RAM小于1GB,Swap空间至少要和RAM一样大,甚至是要为RAM的两倍大小
如果RAM大于1GB,Swap交换空间应该至少等于RAM大小的平方根,并且最多为RAM大小的两倍
如果要休眠,Swap交换大小应该等于RAM的大小加上RAM大小的平方根
free -m
free -m 以MB来查看当前内存的使用情况
[root@~]# free -m
total used free shared buffers cached
Mem: 15947 15770 177 0 172 8884
-/+ buffers/cache: 6712 9234
Swap: 15999 4469 11530
说明:
从内核管理的角度来看
第一行MEM
这一行代表从内核管理的角度来看
total:物理内存大小
used: 当前已使用的内存。其实这些已使用的包含缓存的占用。当内存不足时,可逐渐将缓存占用的内存转变为系统可用的。
free: 剩余的内存大小。 不包括buffers和cached的。
在linux系统中看MEM这一行,used的量一直都会很高,因为有buffers和cached机制,其内存使用是尽可能的使用。而实际上并不是物理硬件的内存不足,当需要使用的时候,操作系统会将buffers和cached的值,转变至运行时应用程序所需要的内存的。
从用户应用角度看
第二行 == -/+ buffers/cache: ==
used: 已使用
free:剩余的可使用的
可以看到: 第二行的free 9234 = 第一行的free + buffers + cached.。
实际从用户的角度来看,运行的应用程序使用的buffers/cache为used 6712M,空闲可以被新的应用程序可用的为9234M。
所以,可以简单理解为当前可用的内存空间还有9234M
swap空间
swap空间使用情况,表明当前历史最高使用量,一般不会主动回缩。
持续监控
free -m s2 每个2秒执行一次,持续监控系统整体内存使用情况
watch -n 2 -d free -m 通过watch持续观察
watch说明:
-n : 每隔2秒钟执行一次
-d:高亮显示与前一次的不同
watch命令会每两秒执行 free -m 一次,执行前会清除屏幕,在同样位置显示数据。因为 watch命令不会卷动屏幕,所以适合出长时间的监测内存使用率。可以使用 -n选项,控制执行的频率;也可以利用 -d选项,让命令将每次不同的地方显示出来。Watch命令会一直执行,直到您按下 [Ctrl]-[C] 为止。
top
top
然后执行命令 shift +m 按照RES常驻内存排序
关于命令的一些说明:
MEM行和SWAP行,显示 内存的整体使用情况,这里的显示其实是从内核角度查看的。所以会看到使用量非常高。而实际可使用的应该是MEM free+MEM buffers+ swap cached是当前系统的可用内存
shift+m 命令: 以RES列进行从大到小排序。查看整体内存使用情况。
选项说明 :
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秒
COMMAND — 进程名称(命令名/命令行)
vmstat 2 5
[root@~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 4563528 695732 152720 8589700 19 5 140 37 0 0 3 0 96 1 0
0 0 4563528 695964 152720 8589716 0 0 1000 58 2827 5514 1 0 99 0 0
0 0 4563528 695980 152728 8589760 0 0 1000 86 2692 5205 1 0 99 0 0
0 0 4563528 695864 152736 8589908 0 0 1000 68 2635 5102 1 0 99 0 0
0 0 4563528 695740 152752 8589940 0 0 1002 148 2770 5236 1 1 98 0 0
通过vmstat查看虚拟使用的情况。默认以字节为单位。
字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小。如果 这个值大于0,则表示物理内存不够了。
so: 每秒写入交换区的内存大小。
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。【interrupt】
cs: 每秒上下文切换数。 【count/second】
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间
备注:
如果r经常大于4,id经常少于40,表示cpu的负荷很重。
如果bi,bo长期不等于0,表示内存不足。
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。
Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
显示活跃和非活跃内存
vmstat -a 2 5 -a 显示活跃和非活跃内存,所显示的内容除增加inact和active
ps命令查看 内存使用情况
常驻内存VSZ使用情况:
ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head
[root@ ~]# ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
32322 pts/0 00:00:00 bash
22584 pts/0 00:00:00 head
22583 pts/0 00:00:00 sort
22582 pts/0 00:00:00 grep
22581 pts/0 00:00:00 ps
按照内存RSS使用情况:
ps aux|head -1;ps|grep -v PID|sort -rn -k 6|head
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。