Apache 性能最优化分析(4)

来源:asp之家 时间:2010-05-22 18:15:00 

但这种实现会引起严重的饥饿问题。由于多个子进程同时执行这个循环,它们将在select中阻塞。当任何socket上出现一个请求时,所有被阻塞的进程将复苏,并从select返回(苏醒进程的数量取决于操作系统和时间)。它们将继续执行并试图接受这个连接,但只有一个进程会成功(假设目前仍只有一个连接),其余进程将阻塞在accept中。这将把所有失败的进程锁定,使它们只为一个socket上的请求服务。它们会一直被阻塞,直到在那个socket上出现足够的请求把它们唤醒。这一饥饿问题首先在PR#467被提出。至少有两种解决它的方法。

  一种方案是使用非阻塞的socket。这种情况下,accept不会阻塞子进程,它们将会立即返回。但这种方案会造成CPU时间的浪费。假设有十个在select中的空闲进程,而后到来了一个连接请求。九个进程将苏醒、试图接受连接、失败,并返回select,这些进程实际什么都没做。而且如果在这期间,其他socket上出现请求,没有哪个进程会为它服务。总而言之,这种方案不是十分有效,除非您拥有和空闲子进程数目相当的CPU--恐怕不切实际。

  另一种方案被Apache采纳。这种方案串行化(serialize)对内层循环的调用。代码如下所示(改进的部分被加粗显示):

for (;;) {
accept_mutex_on ();
for (;;) {
fd_set accept_fds;

FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
}
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
}
}
if (new_connection != -1) break;
}
accept_mutex_off ();
process the new_connection;
}
 
accept_mutex_on和accept_mutex_off 两个函数实现了互斥量(mutual exclusion semaphore),在任意时刻只能有一个子进程拥有互斥量。多种方法可以实现互斥量。在src/conf.h(1.3版之前)或src/include/ap_config.h(1.3版及以后)可以作出以下选择。一些系统不提供任何互斥方法。在这些系统上使用多个Listen命令是不保险的。

标签:apache,性能,优化
0
投稿

猜你喜欢

  • 10月份西联汇款取款指南

    2007-11-03 13:16:00
  • 马云:中国未来3-5年电子商务引爆点将是C2B

    2009-10-10 17:48:00
  • 个人站长感悟:我们一直在努力

    2008-11-06 12:52:00
  • 个人网站快速发展就那么几大绝招

    2008-08-29 12:54:00
  • 在一台服务器上实现多个Web站点

    2010-04-04 18:24:00
  • 为WordPress创建友好搜索引擎的面包屑技巧

    2012-04-25 20:43:24
  • FreeBSD下构建安全的Web服务器(1)

    2007-09-04 14:04:00
  • Discuz!新版预览:主题鉴定功能专为版主设计

    2009-11-12 12:22:00
  • 网页游戏倍受白领和学生青睐

    2008-03-10 11:12:00
  • 在Win2003下建DHCP服务器(1)

    2010-04-14 18:03:00
  • 新域名搜索引擎收录建议

    2008-12-08 12:33:00
  • 眼睛视点的搜索引擎优化 浏览视觉与F形状

    2009-01-19 16:44:00
  • 文本与图片,哪项内容更重要?

    2008-02-15 07:29:00
  • 龙源期刊网兑现承诺 提前免费开放20万杂志

    2009-09-29 14:02:00
  • 淘宝网发布手机旺旺 无线战略加速

    2010-05-27 13:16:00
  • DNS的来由

    2010-01-28 19:25:00
  • 与谷歌机器人约会:关于状态代码节约带宽

    2009-02-06 08:58:00
  • 六种Web浏览器与IE大比拼

    2008-04-23 16:36:00
  • 站长注意SQL 注入一些常用语句

    2007-10-24 23:23:00
  • 使用ZendCore给IIS安装PHP+Zend+Mysql+phpMyAdmin

    2011-01-30 17:42:00
  • asp之家 网站运营 m.aspxhome.com