行业资讯

  • 首页
  • 新闻中心
  • 行业资讯

怎么样调动Linux系统的io性能-宇众网络


2021年01月30日

一 机械磁盘的io的速度主要受“寻道速度”的限制,所以在访问小文件时io性能会极差。如果不在乎成本,可以通过使用固态硬盘来解决这个问题。

二 linux的主流文件系统(如ext4等),在文件系统持续比较满,且需求经常删改文件时,会产生大量文件碎片。在我启发的一款代理服务器中,磁盘长期满负荷运转,运行一个月后文件碎片大约会让io性能降低至只剩20%-30%

百纵科技庆庆带大家来看一下有哪些办法可以减少linux下的文件碎片。另外有一个小技巧,针对互联网图片服务器,可以将io性能提升数倍。

在现有文件系统下进行优化

linux内核和各个文件系统采用了几个优化方案来提升磁盘访问速度。但这些优化方案需求在我们的服务器设计中进行配合才能得到充分发挥。

文件系统缓存

linux内核会将大部分空闲内存交给虚拟文件系统,来作为文件缓存,叫做page cache。在内存不足时,这部分内存会采用lru算法进行淘汰。

通过free命令查看内存,显示为cached的部分就是文件缓存了。

如何针对性优化:

lru并不是一个 优异淘汰算法,lru很大的优势是普适性好,在各种使用场景下都能起到一定的效果。

如果能找到当前使用场景下,文件被访问的统计特征,针对性的写一个淘汰算法,可以大幅提升文件缓存的命中率。

如果不打算写一个新的淘汰算法,一般不需求在应用层再搭一个文件cache程序来做缓存。

很小分配

当文件扩大,需求分配磁盘空间时,大部分文件系统不会仅仅只分配当前需求的磁盘空间,而是会多分配一些磁盘空间。这样下次文件扩大时就可以使用已经分配好的空间,而不会频繁的去分配新空间。

例如ext3下,每次分配磁盘空间时,很小是分配8KB。

很小分配的副作用是会浪费一些磁盘空间(分配了但是又没有使用)

如何针对性优化:

我们在reiserfs下将很小分配空间从8KB改大到128K后提升了30%的磁盘io性能。

在同时有多个io访问时,linux内核可以对这些io访问按LBA进行合并和排序,这样磁头在移动时,可以“顺便”读出移动过程中的数据。

内核有四种不同的排序算法,有些侧重于io性能很大化,也有一些侧重于调度的公平性,大致上的原理都类似于电梯排序。

SATA等磁盘甚至在磁盘中内置了io排序来进一步提升性能,一般需求在主板中进行配置才能启动磁盘内置io排序。linux的io排序是根据LBA进行的,但LBA是一个一维线性地址,无法完全反应出二维的圆形磁盘,所以磁盘的内置io排序能达到更好的效果。

如何针对性优化:

io访问调度能大幅提升io性能,前提是应用层同时发起了足够的io访问供linux去调度。

怎样才能从应用层同时向内核发起多个io访问呢?

方案一是用aio_read异步发起多个文件读写请求。

方案二是使用磁盘线程池同时发起多个文件读写请求。


客服