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的子链表的末端;每个线程等到需要清理时,都必须进行搜索。结果就是,系统在很长一段时间过后才会停机。
来源:计算机世界 责编:豆豆技术应用
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……