Web服务器的性能和可靠性问题绝大部分是由于质量低劣的Web应用造成。inetinfo.exe运行在用户态下,应用程序失进程本身下运行败会导致inetinfo.exe挂起,IIS服务失效。过去的IIS被设计成为只有一个进程--inetinfo.exe,IIS在用户模式下运行,运行在用户模式下的应用程序不直接与硬件通信,它们调用的winsock,winsock将数据传入内核模式的组件(例如网卡驱动程序)。
毛病1:
从性能上,inetinfo进程作为用户态进程工作。用户模式和内核模式之间的转换是一项开销很大的操作。服务器首先从内核模式的TCP/IP栈将传入的HTTP请求传递给用户模式的Winsock,由Winsock将请求传递给IIS。这叫Context Switching
毛病2:
违背了操作系统稳定性的基本原则:
1 把系统代码和用户代码隔离;
2 把应用程序进行隔离。
web服务的所有组成部分都运行在inetinfo.exe,包括系统代码,也包括用户代码。
对质量低劣的代码优化,对提供虚拟主机的ISP来说,通常一台服务器上承载多个web应用, 不可能ISP来排错, 一个web应用出问题,会株连九族。还有客户代码和操作系统代码在共享同一个进程,应用代码有可能对系统代码造成威胁,黑客可能使自己的代码让inetinfo执行一些底层的系统操作,同时inetinfo以system系统权限运行,因此缓冲区溢出会使入侵者获得system权限,进行任何操作。
IIS 5.0减轻这类问题。在IIS 5.0中,我们可以将应用程序保护设置为低级(IIS进程)、中级(缓冲池)、高级(隔离),