比方说…
IIS正在提供一个大小为10MB的静态.MP3资源。 对资源的请求进入HTTP.sys并发送到适当的W3WP进程处理。 工作进程然后从池中抓取一个线程来处理这个请求。 现在,从我的假设来看,当磁盘从磁盘读取.MP3资源时,所述线程将被I / O绑定。 这是准确的吗? 每次请求这个项目时,池中的一个线程正在从磁盘读取相同的内容? W3WP是否使用非阻塞I / O来获取项目?
接下来,假设同一个.MP3文件有1000个同时请求; 由于与其他请求的资源相比的大小,这是否会对网站造成影响? 缓慢,排队等?
这取决于你如何编写你的Web服务或应用程序。 在这种情况下,我们必须就“非阻塞”或“asynchronous”的含义达成一致意见。
通常情况下,w3wp.exe在从存储中检索文件以供服务静态内容时不使用asynchronousI / O调用。 但当然,这并不意味着w3wp.exe是完全死了,因为它正好在服务于一个10MB的文件。 每个工作进程(其中可以有多个在服务器上同时运行的实例)都有一个完整的线程池,包括专用于I / O操作的线程。

当用户通过Web向IIS请求一个静态文件时,w3wp.exe将为请求的文件发出一个IRP_MJ_CREATE(CreateFile API)。 (这可能来自硬盘驱动器,也可能来自文件caching,但与此问题无关)。IRP_MJ_CREATE操作是根据MSDN文档发布的,其选项是“Generic Read”选项:
STANDARD_RIGHTS_READ,FILE_READ_DATA,FILE_READ_ATTRIBUTES,FILE_READ_EA和SYNCHRONIZE。
SYNCHRONIZE选项在这里很有趣:
•要使调用者通过等待返回的FileHandle来同步I / O完成,必须设置SYNCHRONIZE标志。 否则,作为设备或中间驱动程序的调用者必须通过使用事件对象来同步I / O完成。
您也可以使用相同的CreateFile API进行asynchronousI / O,但您可以知道这不是asynchronous调用,因为OVERLAPPED标志未被使用。
CreateFile提供了创build同步或asynchronous的文件或设备句柄。 一个同步句柄的行为使得使用该句柄的I / O函数调用在完成之前被阻塞,而asynchronous文件句柄使得系统可以立即从I / O函数调用返回,无论它们是否完成I / O操作或不。 如前所述,通过在dwFlagsAndAttributes参数中指定FILE_FLAG_OVERLAPPED来确定此同步行为与asynchronous行为。
所以,是的,一千个用户同时从您的网站下载一个10MB文件可能会对您的服务器造成性能影响。 IIS解决这个问题的主要策略是使用大量的线程。 线程耗尽和线程池调整和大小是IISpipe理员需要知道的真实情况。 如果你有一个真正巨大的网站,甚至可能因为I / O绑定和计算绑定等原因将你的静态内容移动到一个独立的web服务器场。IIS性能调整是一个非常复杂的话题,这个特定的Serverfault答案在事物的macros伟计划中是相当迂腐的。 例如,可以在IIS中使用asynchronous处理程序。 这取决于你如何编写你的Web服务/应用程序。