uWSGI 卸载(offloading)子系统

卸载是一种优化小任务的方式,将它们委托给一个或多个线程。

这些线程在非阻塞/事件触发的方式中运行这样的任务,允许大量的并发。

uWSGI栈的各种组件是卸载友好型的,而长期目标是允许应用代码随意使用它们。

要启动卸载子系统,仅需添加–offload-threads <n>,其中<n>是要生成的线程数 (每个worker)。 它们是原生线程,无锁(无共享资源),无惊群效应(到该系统的请求会进行轮询),并且它们是任意使用你的CPU核心的最佳方式。

统计信息子系统的”offloaded_requests”度量中计算了卸载请求的数量。

卸载静态文件

第一个卸载感知的组件是静态文件服务系统。

当卸载线程可用的时候,文件的整个传输会被委托给其中一个线程,立即释放你的worker (这样它就准备好接收新的请求了)

例如:

[uwsgi]
socket = :3031
check-static = /var/www
offload-threads = 4

卸载内部路由

router_uwsgi和router_http插件是卸载友好型的。

你可以路由请求到外部uwsgi/HTTP服务器,而无需担忧在响应生成期间阻塞了worker。

例如:

[uwsgi]
socket = :3031
offload-threads = 8
route = ^/foo http:127.0.0.1:8080
route = ^/bar http:127.0.0.1:8181
route = ^/node http:127.0.0.1:9090

自1.9.11起, cache 路由器也是卸载友好型的了。

[uwsgi]
socket = :3031
offload-threads = 8
route-run = cache:key=${REQUEST_URI}

一旦从缓存检索到该对象,就会在其中一个卸载线程中对其进行传输。

未来

卸载子系统具有很大的潜力,你可以把它想成一个软件DMA:编程它,然后让它单打独斗。

目前,它是相当整体的,但想法是允许更复杂的插件 (一个redis相关的正在进行中)。

下一步是运行用户通过uwsgi api来对它“进行编程”。