前言
有个做外卖平台的客户, 老是喊网站卡住了,不能运营了。让帮忙处理服务器里的垃圾,结果看CPU和硬盘占用都不多
每天访问也不是很大
最终核对的情况是因为它服务器硬盘读写速度太慢, 导致数据库的数据读取和写入缓慢,最终导致用户使用体验不佳。
直接测试一下硬盘读写速度
dd if=/dev/zero of=tempfile bs=1M count=100 conv=fdatasync,notrunc status=progress && rm -f tempfile
这个命令解释如下:
if=/dev/zero 表示输入文件是/dev/zero,这是一个特殊的文件,提供无限的0。
of=tempfile 表示输出文件是当前目录下的tempfile。
bs=1M 表示以1MB为单位进行读写。
count=100 表示复制100个单位,因为单位是1MB,所以总共是100MB。
conv=fdatasync 表示在完成写操作后同步硬盘数据,确保数据的准确性。
notrunc 表示不截断输出文件。
status=progress 表示显示进度信息。
我们可以看到测试100m的文件读写速度是0.998097 s, 没秒速度:105 MB/s
再对比下我自己的服务器
我的速度是:0.153625 s, 683 MB/s
这个差距就出来了。
所以大家别光顾着无脑升级cpu和内存、网络。 也要注意一下硬盘读写速度,如果它拖后腿了, 程序运行也会不流畅的!
下面由CHATGPT深入解释一下 硬盘IO对程序运行速度的影响
硬盘IO(输入/输出)是指硬盘与计算机系统之间数据传输的过程。硬盘IO性能对程序运行速度有着直接和深远的影响,特别是对于那些需要频繁读写磁盘的应用程序。以下是硬盘IO对程序运行速度影响的几个关键方面:
1. 数据访问延迟
硬盘的读写速度远低于内存的读写速度,因此当程序需要从硬盘读取数据或向硬盘写入数据时,都会产生显著的延迟。特别是机械硬盘(HDD)由于其物理旋转盘片和移动读写头的特性,访问数据时的延迟更加明显。即使是固态硬盘(SSD)虽然速度较快,但与内存相比也存在延迟。这种延迟会导致程序等待IO操作完成,从而影响整体运行速度。
2. IO等待时间
当程序执行大量的硬盘IO操作时(例如,数据库操作、文件读写等),CPU可能需要在IO操作完成前等待,这称为IO等待时间。在这段时间内,CPU不能执行其他任务,或者不得不切换到其他较少依赖IO的任务。高IO等待时间意味着CPU资源没有得到充分利用,进而影响程序的执行效率和响应速度。
3. 系统资源竞争
在多任务环境中,多个程序可能会同时进行硬盘IO操作,这会导致系统资源的竞争。当多个进程试图同时访问硬盘时,操作系统需要管理这些请求,决定哪个进程先访问硬盘。这种竞争状态可以导致硬盘IO请求的排队,增加了数据访问的延迟,从而影响到各个程序的运行速度。
4. 缓存和缓冲区的影响
操作系统通常会使用缓存和缓冲区技术来减少硬盘IO对程序运行速度的负面影响。通过预先加载数据到快速访问的内存中,或者将写入操作暂存到缓冲区中,可以减少对实际硬盘IO的需求。然而,当缓存和缓冲区达到其容量限制时,仍然需要访问硬盘,此时硬盘的性能就成为了瓶颈。
5. 硬盘类型的影响
硬盘类型(HDD vs. SSD)对程序运行速度也有重要影响。SSD由于其基于闪存的特性,提供了更高的读写速度和更低的访问延迟,特别适合那些需要频繁进行大量数据读写操作的应用。相比之下,HDD因其机械特性,在随机读写操作上表现不佳,更适合大容量存储和顺序读写操作。
结论
综上所述,硬盘IO是影响程序运行速度的一个重要因素。优化硬盘IO性能,如使用SSD、增加内存以允许更大的缓存、合理安排硬盘IO操作等,都是提高程序运行效率和响应速度的有效方法。在设计和开发软件时,考虑和优化硬盘IO的使用是非常重要的。