多執行緒應用滿足業務增長並減少系統數量,但不可並發的串行代碼限制擴展性(參見阿姆達爾定律與 I/O 問題)。先前嘗試用 Solaris Zones 運行多副本 Xitami/NexSRS 提升效能,但非根治。決定在 Java 中實作 LRWP (Long Running Web Process) 協議並部署於 GlassFish,目標:小系統效能逼近 C 語言寫的 Xitami/NexSRS,大系統擴展性更優。

展現從單核到多核的優異擴展性。
Xitami 用 LRWP 與對等體通訊。類似 CGI:Web 客戶請求 `cgi-bin/context`,容器調用可執行程式傳入輸入、回傳輸出。LRWP 中,對等體與代理建立 TCP 連線,對等體註冊感興趣的 Web Context(如 `/osp`、`/tep`)。請求命中該 Context 時代理轉發輸入給對等體,將回應返回客戶。代理可同時支援多對等體(多執行緒或多進程)。

實作為監聽 `/*` 的 Web 應用:註冊 Context 的請求轉發給對等體;未註冊的交給預設 Servlet 處理。對等體透過 LRWP 協議向代理註冊,建立 `LRWP RequestHandler` 連線,可註冊多 Context、建立多連線實現負載平衡。

OSP (Open Settlements Protocol) 為 VoIP 國際標準,提供 IP 通訊安全機制。NexSRS 為多執行緒 OSP 伺服器兼 LRWP 對等體。流程:
NexSRS 連接 LRWP 代理 (`HOSTNAME:1081`),註冊 `/osp`、`/tep`、`/cgi-bin` 等 Context,各 Context 獨立執行緒處理。代理匹配 URL 如 `https://hostname:1080/osp` 轉發給對應對等體。
$ndd -set /dev/tcp tcp_time_wait_interval 1000
$ndd -set /dev/tcp tcp_conn_req_max_q 10000
$ndd -set /dev/tcp tcp_conn_req_max_q0 10000
/etc/system 新增:
set ip:ipcl_conn_hash_sizes=10000
set tcp_ip_abort_interval=500
這些調整將效能從 4500 CPM 大幅提升,解決 Keep-Alive 相關問題。
| 核心數 | Xitami/NexSRS CPM | CPU% (nexus/Xitami) | GlassFish/NexSRS CPM | CPU% (nexus/GlassFish) |
|---|---|---|---|---|
| 1 | 8,575 | 53 / 45 | 10,569 | 68 / 28 |
| 2 | 12,880 | 44 / 34 | 20,578 | 66 / 26 |
| 4 | 15,470 | 31 / 21 | 27,246 | 43 / 21 |
結論:GlassFish/Java 全面超越 Xitami/C(單核 23%、四核 76% 優勢)。GlassFish 平均 CPU 使用率從單核 68% 降至四核 43%,Xitami 從 45% 降至 21%。NIO 支援讓 GlassFish 使用更少 CPU 時間,賦予 NexSRS 更佳擴展性。增加 Heap 仍可在 64 位 JVM 獲更大提升空間。