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