简介
内存和磁盘都是计算机中的存储器,都具有存储功能,属于存储设备。在计算机中,磁盘和内存是相互配合共同作业的。
区别:
- 1:内存是一种高速,造价昂贵的存储设备;而磁盘速度较慢,造价低廉。
- 2:内存属于内部存储设备,磁盘属于外部存储设备
- 3:内存是通过电流来实现存储;磁盘是通过磁记录来实现存储。所以电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。
内存
内存是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的。其作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
磁盘
磁盘(disk)是指利用磁记录技术存储数据的存储器。
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。
磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。
内存管理相关命令
内存:free
- free -h : 以更友好的方式显示,会以K、M、G为单位来显示
- free -m :以M为单位打印结果
各列信息:
- Mem:内存使用情况。
- Swap:交换空间(虚拟内存)使用情况。
- total:系统总共可用物理内存、交换空间大小。
- used:已经被使用的物理内存、交换空间大小。
- free:剩余可用物理内存、交换空间大小。
- shared:被共享使用的物理内存大小。
- buff/cache:被 buffer 和 cache 使用的物理内存大小。
buffers:用于存放要输出到disk(块存储)的数据,在这里buff是指被OS buffer住的内存(written to disk);
cached:存放从disk上读出的数据;buffer和cache是为了提高IO性能并由OS管理。 - available:还可以被应用程序使用的物理内存大小。
注意: - 应用程序可用内存/系统物理内存 > 70% 内存充足
- 应用程序可用内存/系统物理内存 < 20% 内存不足,需要增加内存
- 20% < 应用程序可用内存/系统物理内存 < 70%,表示内存基本够用
vmstat命令
vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控,是对系统的整体情况进行的统计。
memory列 - swpd:使用的虚拟内存大小。
- free:空闲物理内存大小。
- buff:buffer cache内存大小。
- cache:page cache的内存大小。
swap列 - si:每秒从交换区读入到内存的大小,由磁盘调入内存(单位:kb/s)
- so:每秒从内存写出到交换区的大小,由内存调入磁盘(单位:kb/s)
以上是与内存相关的两列。
procs - r:运行和等待的CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不超过总核数的2倍,否则代表系统压力过大。
- b:等待资源的进程数,比如正在等待磁盘I/O、网络I/O等
cpu - us:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序
- sy:内核进程消耗的CPU时间百分比
为什么要使用虚拟内存?
大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多。问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕。所以提出了虚拟内存,使得每个进程用于3G的独立用户内存空间和共享的1G内核内存空间。(每个进程都有自己的页表,才使得3G用户空间的独立)这样进程运行的速度必然很快了。而且虚拟内存机制还解决了内存碎片和内存不连续的问题。为什么可以在有限的物理内存上达到这样的效果呢?这就要提到虚拟内存的实现机制了。
虚拟内存的实现机制
首先呢,提一个概念,交换空间(swap space),这个大家应该不陌生,在重装系统的时候,会让你选择磁盘分区,就比如说一个硬盘分几个部分去管理。其中就会分一部分磁盘空间用作交换,叫做swap space。其实就是一段临时存储空间,内存不够用的时候就用它了,虽然它也在磁盘中,但省去了很多的查找时间啊。当发生进程切换的时候,内存与交换空间就要发生数据交换一满足需求。所以啊,进程的切换消耗是很大的,这也说明了为什么自旋锁比信号量效率高的原因。
pidstat -r
- PID: 进程标识符
- minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
- majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
- VSZ: 该进程使用的虚拟内存(以kB为单位)
- RSS: 该进程使用的物理内存(以kB为单位)
- %MEM: 该进程使用内存的百分比
- Command:task命令名
查看磁盘信息
查看硬盘磁盘IO
- rkB /s:每秒读取数据量kB;
- wkB/s:每秒写入数据量kB;
- svctm I/O:请求的平均服务时间,单位毫秒
- await I/O:请求的平均等待时间,单位毫秒,值越小,性能越好
- util:一秒钟有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;
rkB/s,wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。
svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘
通过pidstat -d也可以查看磁盘IO信息
- PID:进程id
- kB_rd/s:每秒从磁盘读取的KB
- kB_wr/s:每秒写入磁盘KB
- kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
- iodelay:任务的I/O阻塞延迟,以时钟周期为单位,包括等待同步块 I/O 和换入块 I/O 结束的时间
- COMMAND:task的命令名