多语言展示
当前在线:238今日阅读:84今日分享:32

设计高性能ISAPI应用程序

ISAPI应用程序为Web应用提供高性能的接口。创建一个ISAPI扩展或过滤器执行相似任务比在ASP页或组件中优越。ISAPI现有速度不代表你就不用考虑可扩展性和忽略性能。ISAPI不能使用ASP和COM提供支持的大部分应用程序。若你需要ISAPI应用执行会话状态,你需要自己在实例中实现会话状态的功能。下面是ISAPI扩展改进可扩展性和性能的建议: o 避免使用ISAPI过滤器 - 避免ISAPI过滤器,至少添加一个ISAPI过滤器是应用程序必需的结构。在传入和输出原始数据执行处理,或者对请求做加工处理时,你应该避免使用过滤器。换名话说,创建复杂响应中断请求应该避免过滤器。通常情况错误响应是过滤器发送的唯一响应。例如,一个身份验证过滤器可能发送一个401响应返回客户端。如果确定一个过滤器是绝对必要的,代码中一定要小心优化过滤器事件通知代码。 o 创建您自己的工作线程池。-您应该创建自己的工作线程池,以便I/O线程可以自由完成其它任务。此选项仅适用于ISAPI扩展。 o 考虑使用异步操作 - IIS支持异步读写。根据I/O操作执行类型处理,可以更好的利用现有CPU时间。当实施使用一个工作线程池时,异步操作可以很好工作。 o 使用 Win32 TransmitFile 函数 - 当发送HTML或图像文件时,ISAPI应该使用Win32 TransmitFile 函数,ServerSupportFunction 调用 HSE_REQ_TRANSMIT_FILE 成员函数来传送一个文件给请求者。 o 使用 VectorSend 函数 - IIS 6.0 支持 VectorSend,允许将一群缓冲区和文件句柄放在一起,以便依序传送,接着交由 IIS 6.0 编译出最后的响应。VectorSend 支持是由 ServerSupportFunction 调用 HSE_REQ_VECTOR_SEND 成员函数支持。 o 线程同步需要最小化 - 使用请求上下文维持会话状态信息,你可以尽量减少对线程同步最小化的需要。若确实需要线程同步,尽量保证临界区保持简短。 o 考虑备选堆方案 - 若你的ISAPI应用使用大量的堆,你应该考虑备选堆方案。大量Windows堆使用可以导致资源占用。几个值得探索的内存分配方案,包括: o 堆分配 - 除默认进程堆外为每个线程创建多管道自定义堆。一个单独的,非全局锁控制每个自定义堆和减少死锁。 o 缓存分配 - 使用自定义缓存操作以便在对象用户和堆之间进行中间层操作。Win32 堆很少被调用并且仅用在大内存块。这些块以自定义方式分配分割和管理。 o 堆栈分配 - 使用 c运行时函数 _alloca 用堆栈替代堆在你的对象上分配内存。由于堆栈使用可用空间限制,这个方法只仅适用于小对象。此外,你新分配的对象仅适用于当前函数,或该函数调用的函数可用。一旦当前函数返回到调用程序中,在堆栈上分开的存储将丢失。 o对象封装 - 类的数据成员结构中包含一个缓冲区。使用此任务缓冲区为Win32堆请求访问。 o 避免你的ISAPI使用全局锁 - 全局锁总是影响可扩展性。
推荐信息