假设...
IIS 正在提供大小为 10MB 的静态 .MP3 资源。资源请求进入 HTTP.sys 并发送到相应的 W3WP 进程进行处理。然后,工作进程从池中获取一个线程来处理此请求。现在,根据我的假设,所述线程在从磁盘读取 .MP3 资源时将受到 I/O 限制。这是准确的吗?每次收到对此项目的请求时,池中的线程都会从磁盘读取相同的内容?W3WP 是否使用非阻塞 I/O 来获取该项目?
接下来,假设有 1000 个请求同时请求同一个 .MP3 文件;由于与其他请求的资源相比文件大小较大,这会对网站造成影响吗?速度缓慢、排队等?
答案1
这取决于您如何编写 Web 服务或应用程序。重要的是,我们要就“非阻塞”或“异步”在此上下文中的含义达成一致。
通常情况下,w3wp.exe 在从存储中检索文件以提供静态内容时不会使用异步 I/O 调用。但这并不意味着 w3wp.exe 会因为恰好当前正在提供 10MB 的文件而完全停止运行。每个工作进程(其中可能有许多实例在服务器上同时运行)都有一个完整的线程池,包括专用于 I/O 操作的线程。
当用户通过 Web 从 IIS 请求静态文件时,w3wp.exe 会为所请求的文件发出 IRP_MJ_CREATE(CreateFile API)。(这可能来自硬盘驱动器,也可能来自文件缓存,但这与本问题无关。)IRP_MJ_CREATE 操作以“通用读取”选项发出,根据MSDN 文档,其实就是这组选项:
STANDARD_RIGHTS_READ、FILE_READ_DATA、FILE_READ_ATTRIBUTES、FILE_READ_EA 和同步。
这里最有趣的是 SYNCHRONIZE 选项:
• 调用者若要通过等待返回的 FileHandle 来同步 I/O 完成,必须设置 SYNCHRONIZE 标志。否则,作为设备或中间驱动程序的调用者必须使用事件对象来同步 I/O 完成。
您也可以将相同的 CreateFile API 用于异步 I/O,但您可以判断这不是异步调用,因为未使用 OVERLAPPED 标志。
CreateFile 提供创建同步或异步文件或设备句柄的功能。同步句柄的行为是,使用该句柄的 I/O 函数调用被阻止,直到它们完成为止,而异步文件句柄使系统能够立即从 I/O 函数调用返回,无论它们是否完成了 I/O 操作。如前所述,这种同步与异步行为是通过在 dwFlagsAndAttributes 参数中指定 FILE_FLAG_OVERLAPPED 来确定的。
因此,是的,一千名用户同时从您的网站下载 10MB 的文件可能会对您的服务器性能造成影响。IIS 解决此问题的主要策略是使用大量线程。线程耗尽和线程池调整和大小调整是 IIS 管理员需要了解的真正问题。如果您有一个非常庞大的网站,您甚至可能会因为 I/O 限制与计算限制等问题而将静态内容移动到单独的 Web 服务器场。IIS 性能调整是一个非常复杂的主题,而这个特定的 Serverfault 答案在宏观上相当迂腐。例如,它是可以在 IIS 中使用异步处理程序。这取决于您如何编写 Web 服务/应用程序。