Linux内核4096路处理器系统上的瓶颈

http://tech.ddvip.com   2007年05月21日    社区交流

本文详细介绍Linux内核4096路处理器系统上的瓶颈

  为什么modprobe命令的运行速度那么慢?本文介绍了如何避免4096路处理器系统上的瓶颈。

  使用真正大型机器的乐趣,一方面在于能够比别人更早在可扩展性方面发现新的惊奇,所以使用SGI高性能计算机的人常常比我们许多人享有更多的乐趣。他们最近的发现与内核线程的数量有关: 在4096路系统上,Linux内核线程的数量导致内核出现了令人关注的一些行为。

  发现问题

  首先他们发现:即使使用默认的配置,也启动不了内核。Linux系统在任何一个特定的时间,活动进程通常限制在32768个。运行过ps命令的人都会注意到: 内核线程在占用数量越来越多的内存插槽。单处理器桌面系统可能在运行其中的39个活动进程。实际上,如今一个典型的系统上有足够多的内核线程,以至这些线程会占满4096路机器上的全部空间,甚至更多。这个问题比较容易得到解决,只要提高处理器数量的限额。不过,这样一来情况变得比较有意思了。

  对系统上的其他每个进程(包括内核线程)来说,init进程是最终的父进程。所以在大型系统上,init有许多子进程。这些子进程位于一个很大的链表(linked list)上。该链表由诸多函数来搜索,其中包括wait()的变种版本。如果正在搜索中的进程接近链表末端,那么这个搜索需要花费很长时间。一是因为大多数内核线程是长期线程,二是因为新进程被放在链表末端,所以某次搜索很可能确实会寻找末端的某个进程。

  然后把某个模块装入内核。当新模块进行链接时,模块装入过程就会调用stop_machine_run(),该函数会为系统上的每个进程创建高优先级的内核线程。该线程就会获取分配给它的CPU,然后只是闲置在那里,直到被告知退出;尽管所有CPU以这种方式被搁置起来,但链接过程照常执行。即便在最好的时候(即线程数量不多的时候),调用stop_machine_run()这样的函数也是有点不合常理,更何况对一个拥有4096路处理器的系统而言,stop_machine_run()会创建4096个线程,每个线程都会进入到init的子链表的末端;每个线程等到需要清理时,都必须进行搜索。结果就是,系统在很长一段时间过后才会停机。

来源:计算机世界    责编:豆豆技术应用

正在加载评论...