⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000017.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
了万一系统崩溃丢失数据的危险性。到底是不是应该这样做,你只有自己去判断。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;文件句柄数和i-节点数&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;/proc/sys/fs下的文件设置一些文件系统的重要参数,特别是设置可以同时打开的文&nbsp;<BR>件数目。缺省的情况下,系统中允许同时打开的文件数目是4096。在一个大型的网站中&nbsp;<BR>,这个数字很容易被突破,因此你有可能需要改变这个值。于打开文件相关的主要文件&nbsp;<BR>是file-max和inode-max。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;一般情况下,最大打开文件数设置不应该超过物理内存(以兆计算)乘以64,而最大&nbsp;<BR>的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。例如,我们将最大打开文件&nbsp;<BR>数设置成为8192,而i节点的数目设置为31768,那么&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;echo&nbsp;'8192'&nbsp;&gt;&nbsp;/proc/sys/fs/file-max&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;echo&nbsp;'32768'&nbsp;&gt;&nbsp;/proc/sys/fs/inode-max&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;ulimit命令&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;除了核心的限制之外,还有一些系统自动对用户进程的限制,例如在第二章我们曾经&nbsp;<BR>设置的forks限制。这些限制可以用ulimit命令限制:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;$ulimit&nbsp;-a&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;core&nbsp;file&nbsp;size&nbsp;(blocks)&nbsp;&nbsp;0&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;data&nbsp;seg&nbsp;size&nbsp;(kbytes)&nbsp;&nbsp;&nbsp;unlimited&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;file&nbsp;size&nbsp;(blocks)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;max&nbsp;memory&nbsp;size&nbsp;(kbytes)&nbsp;unlimited&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;stack&nbsp;size&nbsp;(kbytes)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8192&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;cpu&nbsp;time&nbsp;(seconds)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlimited&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;max&nbsp;user&nbsp;processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;pipe&nbsp;size&nbsp;(512&nbsp;bytes)&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;open&nbsp;files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;virtual&nbsp;memory&nbsp;(kbytes)&nbsp;&nbsp;2105343&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;执行带-a参数的ulimit命令显示了当前各种用户进程限制。通常,对于服务器进程来&nbsp;<BR>说,第一个需要调整的是每个进程可以打开的文件数目限制。显然,在缺省配置中,这&nbsp;<BR>个限制是1024,我们可以手工将这个数字加大:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;ulimit&nbsp;–n&nbsp;4096&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;这个过程将每个进程可以打开的文件数目加大到4096。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;下一个需要限制的东西是每个进程使用的内存量,一般我们可以限制httpd或者cgi进&nbsp;<BR>程使用的内存量,下面的命令将每个进程使用的内存限制在4MB:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;ulimit&nbsp;–m&nbsp;4096&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;当然,设置forks进程的数目也是熟知的:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;ulimit&nbsp;–u&nbsp;512&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;注意你只能最大将这个数字设置到512。如果512仍然不够,那么你需要修改内核的源&nbsp;<BR>代码。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;9.9.3&nbsp;服务器的特有问题&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;作为服务器的守护进程,各种守护程序会不断地forks出各种子进程,或是启动另外的&nbsp;<BR>服务程序。每一种服务程序都具有自身的问题,但是最常见的问题出在apache和inetd。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;让我们首先考虑inetd。这个程序的行为我们已经很清楚,它在后台运作,每当应该由&nbsp;<BR>它负责的端口接收到请求时就去启动对应的服务程序。你可能会非常奇怪inetd有什么好&nbsp;<BR>处,为什么这样多的程序都由它启动,回答是inetd将正常的tcp/ip&nbsp;数据流简化为标准&nbsp;<BR>流式文件I/O。如果一个程序是从inetd启动,那么它根本不需要考虑网络编程的问题,&nbsp;<BR>而只要简单地对stdin和stdout操作,好像网络数据流不存在一样。这种编程上的简单性&nbsp;<BR>使得许多人使用inetd作为自己的程序执行平台。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;然而inetd的这种实现使得它本身是一个效率比较低的系统,如果单单是效率比较低的&nbsp;<BR>话我们还可以忍受,问题在于,出于安全性方面的考虑,inetd被设置为监测单位时间内&nbsp;<BR>的请求个数,一旦超过某个值(大约每秒40次)就关闭对应的服务,直到请求恢复正常&nbsp;<BR>。显然,对于负载量比较大的站点,使用inetd进行服务根本就是一个玩笑。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;像apache这样的程序,可以设置为作为一个单独的守护进程启动,这样就不需要使用&nbsp;<BR>inetd了,因此只要守护进程设计比较合理,就可以接收足够多的请求。但是像in.ftpd&nbsp;<BR>和pop3d这样的程序显然是要一个相当于inetd的服务程序才能正确启动的。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;解决的办法是使用某种代替产品,例如在qmail那一章中我们介绍的tcpserver程序,&nbsp;<BR>这个程序完成和inetd一样的工作,但是可以接受更多的请求。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;现在我们来考虑apache服务器的问题。实际上,Internet上主要的数据流量都来源于&nbsp;<BR>WEB页面,而且在接入internet的情况下,一台服务器的大部分资源都是用来执行httpd&nbsp;<BR>服务。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;apache服务器本身是一个守护进程,按照我们说的forks方式工作。由于连接到服务器&nbsp;<BR>的请求数可能非常大,因此一般来说apache服务器并不会在接收到一个请求的时候就fo&nbsp;<BR>rks出一个进程。按照Apache开发组自己的说法,同时连接数与forks数量的比值大约是&nbsp;<BR>5:1,也就是httpd进程的数目是最大同时连接数的20%。这个估计可能有些保守,实际的&nbsp;<BR>forks数目很可能会比这里估计的数量多一些。无论如何,即使按照这样的数字,缺省的&nbsp;<BR>256的forks极限也是容易被突破的,因为对于一个商业网站,每天几十万到上百万的访&nbsp;<BR>问量是很正常的,而且一般情况下每个http请求都会生存一段时间。实际上,一千左右&nbsp;<BR>的同时连接是重负荷服务器上的常见情形,这刚好达到了256的危险极限。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;如同我们说的,用ulimit命令可以提升forks限制到512,但是再加大的话,意义已经&nbsp;<BR>不大,首先你必须修改系统内核源代码,其次是同时连接数在2000以上的时候,普通的&nbsp;<BR>x86服务器已经很难应付了。这时最合适的解决方法应该是使用服务器集群或者类似的技&nbsp;<BR>术(见后)。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;不管怎样,如果你真的有一个非常高档的服务器,而你希望提升系统的forks进程数极&nbsp;<BR>限,你应该修改linux内核源码的include/linux/tasks.h,查找到这样一行:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#define&nbsp;NR_TASKS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;512&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;把512改成较大的值。对于intel系列的CPU,建议你最大用到4090。进一步增加将导致&nbsp;<BR>系统无法引导。更改之后,重新编译内核,就可以使用大得多的forks极限了。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;对于Apache的forks有一个特殊的问题,Apache服务器在启动的时候自动设置了自己能&nbsp;<BR>产生的子服务进程的数目限制,对于普通的版本,这个数目被设置为256,你应该自己加&nbsp;<BR>大这个数值,在apache源代码的src/include/httpd.h中你可以看到&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#ifndef&nbsp;HARD_SERVER_LIMIT&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#ifdef&nbsp;WIN32&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#define&nbsp;HARD_SERVER_LIMIT&nbsp;1024&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#else&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#define&nbsp;HARD_SERVER_LIMIT&nbsp;256&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;#endif&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;将相关的HARD_SERVER_LIMIT从256改成512,然后重新编译apache,在apache的启动脚&nbsp;<BR>本中使用ulimit&nbsp;–u&nbsp;512就可以了。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;9.10&nbsp;负载均衡和其他手段&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;作为一个服务器管理员,你当然希望永远不要改变服务器的架构。然而,你的服务器&nbsp;<BR>会接收越来越多的服务要求。尤其是电子邮件和www服务器,它们的性质也许不会有什么&nbsp;<BR>本质的变化,然而其数量却会以可怕的速度增长,上一节我们已经提到了由于请求数增&nbsp;<BR>加造成的可能问题,这一节我们考虑如果你的Linux系统已经无法应付巨大的服务请求时&nbsp;<BR>,你应该用什么办法处理问题。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;9.10.1&nbsp;反向代理和Apache本身的优化&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;我们已经熟悉了代理的概念。象squid这样的WWW代理程序,可以用来代理加速客户对&nbsp;<BR>外部世界的访问,也可以倒过来,用来缓冲来自外界的访问,提高WEB服务器对外界请求&nbsp;<BR>的相应能力。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;在这种反向代理模式下面,squid运行在服务器的80端口接收外界世界的请求,然后把&nbsp;<BR>请求转交给Apache&nbsp;的httpd程序。由于squid不需要forks,它对静止页面(一个网站中&nbsp;<BR>不包含cgi、SSI,PHP的部分,或者说不变的html文本以及图像)的处理效能要比apach&nbsp;<BR>e高得多。这样,Apache只需要处理那些cgi程序和服务器脚本就可以了。实际上,象No&nbsp;<BR>vell这样的公司也曾经使用过这种技术。&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;要把squid配置成为反向代理服务器,首先要配置它在80端口运行,这是通过配置/et&nbsp;<BR>c/squid.conf中的http_port行实现的:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;http_port&nbsp;80&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;一般情况下,squid只是耗费巨大的磁盘空间和内存,而对CPU的负担并不重,因此你&nbsp;<BR>可以把Apache服务器和squid放在同一台服务器上,这时,只需要用http_accel_host和&nbsp;<BR>http_accel_port告诉squid到哪里寻找真正的Web服务器。例如,我们把apache配置在同&nbsp;<BR>一台机器的82端口运行(利用Port,Bind和Listen语句),那么:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;httpd_accel_host&nbsp;localhost&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;httpd_accel_port&nbsp;82&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;当然,你也可以把Apache放到别的机器上:&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;httpd_accel_host&nbsp;&nbsp;other_apache&nbsp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -