通过 ulimit 改善系统性能
?
http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/
?
通过 ulimit 改善系统性能打印本页
<noscript></noscript><script type="text/javascript"></script>将此页作为电子邮件发送
<noscript></noscript><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->级别: 初级
孙 翎, 软件工程师, IBM
叶 光昶, 软件工程师, IBM
潘 宁河, 软件工程师, IBM
2009 年 11 月 26 日
本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 使用方法。通过这篇文章,读者不仅可以了解 ulimit 所起的作用,并且可以学会如何更好地通过 ulimit 限制资源的使用来改善系统性能。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
回页首
在下面的章节中,将详细介绍如何使用 ulimit 做相应的资源限制。
回页首
回页首
大家可以看到此时的 ls 命令运行正常。下面设置 ulimit:
从上面的信息可以看出,这个 libc 库文件的大小是 1.5MB。而我们用 ulimit 所设置的内存使用上限是 1000KB,小于 1.5MB,这也就充分证明了 ulimit 所起到的限制 shell 内存使用的功能。
现有一个文件 testFile 大小为 323669 bytes,现在使用 cat 命令来创建一个 testFile 的 copy:
从上面的输出可以看出,我们成功的创建了 testFile 的拷贝 newFile。
下面我们设置 ulimt – f 100:
这次创建 testFile 的拷贝失败了,系统给出的出错信息时文件大小超出了限制。在 Linux 系统下一个 block 的默认大小是 512 bytes。所以上面的 ulimit 的含义就是限制 shell 所能创建的文件最大值为 512 x 100 = 51200 bytes,小于 323669 bytes,所以创建文件失败,符合我们的期望。这个例子说明了如何使用 ulimit 来控制 shell 所能创建的最大文件。
因此,我们可以通过使用 ulimit – n 来限制程序所能打开的最大文件描述符数量,从而达到限制 socket 创建的数量。
每当一个新的线程被创建时都需要新分配一段大小为 1232KB 的内存空间,而我们总的虚拟内存限制是 200MB,所以如果我们需要创建更多的线程,那么一个可以改进的方法就是减少每个线程的固定堆栈大小,这可以通过 ulimit – s 来实现:
从上面的信息可以看出,我们已经成功的将线程的堆栈大小改为 512KB 了,这样在总内存使用限制不变的情况下,我们可以通过本小节介绍的方法来增加可以创建的线程数,从而达到改善程序的多线程性能。
总结
综上所述,linux 系统中的 ulimit 指令,对资源限制和系统性能优化提供了一条便捷的途径。从用户的 shell 启动脚本,应用程序启动脚本,以及直接在控制台,都可以通过该指令限制系统资源的使用,包括所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存,等等方面。本文中的示例非常直观的说明了 ulimit 的使用及其产生的效果,显而易见,ulimit 对我们在 Linux 平台的应用和开发工作是非常实用的。