Exploring PAGI::Server: A Promising Async HTTP Server for Perl
In the realm of asynchronous HTTP servers, PAGI::Server, built on IO::Async, Future::IO, and an EVevent loop, has been gaining attention. This article delves into its performance, behavior, and potential implications for North East India and beyond.
Understanding PAGI::Server's Architecture
PAGI::Server is a single-process, event-driven server that can optionally scale out using workers. It is fully async end-to-end, with streaming-first semantics, designed to support ASGI-like semantics in Perl. The server routes work through IO::Async::Stream objects, allowing application code to produce responses via a $send callback.
Baseline: Fast Responses
Before diving into streaming, a trivial HTTP handler was tested on a 16-core MacBook Pro. The results were encouraging, with ~22k requests per second and minimal latency, confirming the absence of accidental serialization or blocking in the accept loop.
Streaming Test: 2-Second Responses, 500 Concurrent Clients
Switching to a streaming handler that sends chunks over 2 seconds, the server demonstrated impressive performance with 500 concurrent connections. It handled ~242 requests per second, with CPU usage between 10-20%, validating the server's ability to handle streaming efficiently without head-of-line blocking, per-connection threads, or accidental buffering.
Overload Behavior: What Happens at 2500 Concurrent Streams?
With no limit set, PAGI::Server started rejecting connections around 2000 open sockets, returning a 503 Service Unavailable response, and a Connection: close header. This behavior is good, as the server applied admission control based on available file descriptors, demonstrating its ability to handle overload gracefully.
Scaling Out: 16 Workers
With 16 worker processes, the same workload sustained ~1200 requests per second at 2500 concurrent connections, validating that PAGI's worker model increases capacity cleanly without breaking streaming semantics.
The Real Test: Slow Clients and Backpressure
To test backpressure, a stress app that streams tens of megabytes as fast as possible was used, and clients were artificially throttled. PAGI::Server demonstrated resilience, maintaining throughput and handling the backpressure effectively.
Implications for North East India and Beyond
The performance of PAGI::Server has significant implications for the North East region and broader Indian context, where high concurrency and streaming applications are becoming increasingly common. Its ability to handle streaming efficiently, manage overload gracefully, and scale out cleanly makes it an attractive choice for developers in the region.
Conclusion
PAGI::Server has proven its ability to handle streaming correctly, manage backpressure effectively, and scale out gracefully. While more testing is needed, the fundamentals are solid, and the server's honest approach to async programming sets it apart from other solutions.