首先 、用top命令查看
top - 16:15:05 up 6 days, 6:25, 2 users, load average: 1.45, 1.77, 2.14
Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.2% sy, 0.0% ni, 86.9% id, 12.6% wa, 0.0% hi, 0.0% si
Mem: 4037872k total, 4003648k used, 34224k free, 5512k buffers
Swap: 7164948k total, 629192k used, 6535756k free, 3511184k cached
查看12.6% wa
IO等待所占用的CPU时间的百分比,高过30%时IO压力高
其次、 用iostat -x 1 10
avg-cpu: %user %nice %sys %iowait %idle
0.00 0.00 0.25 33.46 66.29
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 1122 17.00 9.00 192.00 9216.00 96.00 4608.00 123.79 137.23 1033.43 13.17 100.10
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
查看%util 100.10 %idle 66.29
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)
vmstat -1
如果你想对硬盘做一个IO负荷的压力测试可以用如下命令
time dd if=/dev/zero bs=1M count=2048 of=direct_2G
此命令为在当前目录下新建一个2G的文件
我们在新建文件夹的同时来测试IO的负荷情况。
在linux中,对于一次读取IO请求(不仅仅是磁盘,还有网络)的 *** 作,数据并不会直接拷贝到用户程序的用户空间缓冲区。它首先会被拷贝到 *** 作系统的内核空间,然后才会从 *** 作系统内核的缓冲区拷贝到用户空间的缓冲区。大概是这个样子。
从图中可以看见,这是分四步进行的,而这四步里面有些细节,就有了这5种IO模型
前四种为同步IO,后一种为异步IO,什么是同步异步可以看看我之前写的 同步与异步,阻塞与非阻塞 。
应用进程发起系统调用后就阻塞了,直到内核buffer拷贝到用户buffer,发出成功提示后才继续执行。
适用场景:并发量小的要及时响应的网络应用开发,JavaBIO。
优点:易于开发,不消耗CPU资源(线程阻塞),及时响应。
缺点:不适用与并发量大的网络应用开发,一个请求一个线程,系统开销大。
应用进程发起系统调用,内核立马返回一个自己当前的缓冲区的状态(错误或者说成功),假如
为错误则隔段时间再系统调用(轮询),直到返回成功为止。另外再说一点,有人说轮询之间可以设置一个时间,例如每几秒执行一次,然后在这段期间程序可以干自己的事情。(这个我不清楚是不是,虽然理论上可以实现,但是我觉得第一种与第二种的区别应该强调的是是否放弃CPU,第二种有点CAS+轮询这种轻量级锁的感觉,第一种就是那种重量级锁的感觉)。
适用场景:并发量小且不用技术响应的网络应用开发
优点:易于开发,可以在轮询的间断期间继续执行程序。
缺点:不适用与并发量大的网络应用开发,一个请求一个线程,系统开销大。消耗CPU资源(轮询),不及时响应。
将多个IO注册到一个复用器上(select,poll,epoll),然后一个进程监视所有注册进来的IO。
进程阻塞在select上,而不是真正阻塞在IO系统调用上。当其中任意一个注册的IO的内核缓冲区有了数据,select就会返回(告诉程序内核态缓存有数据了),然后用户进程再发起调用,数据就从内核态buffer转到用态buffer(这段期间也是要阻塞的)。
适用场景:并发量大且对响应要求较为高的网络应用开发,JavaNIO
优点:将阻塞从多个进程转移到了一个select调用身上,假如并发量大的话select调用是不易被阻塞的,或者说阻塞时间短的。
缺点:不易开发,实现难度大,当并发量小的时候还不如同步阻塞模型。
应用程序向内核注册一个信号处理程序,然后立即返回,当数据准备好了以后(数据到了内核buffer),内核个应用进程一个信号,然后应用进程通过信号处理程序发起系统调用,然后阻塞直达数据从内核buffer复制到用户buffer。
优点:将阻塞从多个进程转移到了一个select调用身上,假如并发量大的话select调用是不易被阻塞的,或者说阻塞时间短的。
缺点:不易开发,实现难度大。
以上四个IO模型都可以看出来,到最后用户进程都要在数据从内核buffer复制到用户buffer时阻塞,直到内核告诉进程准备成功。这就是同步进程,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续 *** 作。
就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续 *** 作
这个就是直到数据copy完成到用户buffer才通知。
应用场景:Java AIO,适合高性能高并发应用。
优点:不阻塞,减少了线程切换,
缺点:难以实现,要 *** 作系统支持。
在 Linux 系统中,可以使用以下命令查看 CPU 信息:
top: 显示系统进程的实时状态
htop: 与 top 类似,但提供了更多的信息和更好的可视化
mpstat: 显示多核 CPU 的状态
lscpu: 显示系统 CPU 的配置信息
查看 IO 信息,可以使用以下命令:
iostat : 用于检测磁盘I/O的使用状况
vmstat : 用于检测虚拟内存的使用状况
mpstat : 用于检测 CPU 和磁盘I/O的使用状况
dstat : 用于检测磁盘I/O,网络,CPU等系统资源的使用状况
需要注意的是这些命令需要安装对应的工具包
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)