作者: 王璞
长期以来,计算机系统IO的速度一直没能跟上CPU速度的提升,相比而言IO往往成为系统的性能瓶颈,计算任务等待IO存取数据,成为高性能系统的一大性能瓶颈。本文先剖析IO性能瓶颈的根源,然后举例说明如何解决IO瓶颈,最后简要介绍我们在高性能IO方面的尝试。
目录
IO性能瓶颈
当用户程序执行IO操作时,绝大多数情况下是调用操作系统内核提供的系统调用来执行IO操作,最常见的IO系统调用是read和write。在现代计算机体系结构和操作系统的架构下,导致程序IO性能瓶颈主要有三大因素:阻塞、上下文切换、内存拷贝。下面分别简述为什么这三个因素会导致程序性能下降。
阻塞
阻塞比较好理解,比如用户程序调用read系统调用来读取数据,如果要读取的数据没有准备好(没有命中缓存),那用户程序就会被阻塞,导致用户程序休眠。等要读的数据加载到系统态的内存之后,内核再唤醒用户程序来读取数据。
阻塞对用户程序性能最大的影响在于,用户程序会被强制休眠,而且用户程序什么时候被唤醒也无法控制,程序休眠期间什么都不能做。于是阻塞带来了大量的休眠等待时间。如果程序把大量时间花在阻塞等待IO上,自然IO效率低下,进而导致程序性能受影响。
上下文切换
上下文切换是操作系统的基本概念。内核运行在系统态,用户程序运行在用户态,这么做主要是处于安全的考虑,限制用户程序的权限。用户程序调用系统调用执行IO操作,会发生上下文切换,比如用户程序调用read系统调用来读取数据,用户程序的上下文被保存起来,然后切换到内核态执行read系统调用,当read系统调用执行完毕,再切换回用户程序。
上下文切换的代价不小,一方面内核要保存上下文现场,另一方面CPU的流水线也会被上下文切换打断,需要重新加载指令。上下文切换等同一次中断操作,于是系统调用也被称软中断。频繁的上下文操作对计算机系统带来很大的开销,导致程序执行效率大大降低,进而极大影响程序的性能。
此外,阻塞的时候,一定会发生上下文切换。还是沿用read操作的例子,用

最低0.47元/天 解锁文章
1943

被折叠的 条评论
为什么被折叠?



