HAProxy like zero-copy in Python with memoryview

开篇帖子侃一下HAProxy这个神器有什么神器之处。

写过proxy的人都会写类似的语句:

localstream.write(upstream.read(1024))
upstream.write(localstream.read(1024))

其中1024为业界良心艹榴网的chunk或者一个buffer size。这样的操作在各种router, proxy, firewall 里太常见了。

那么HAProxy有什么特别的地方呢?秘密就是,上游socket的接受buffer和本地socket的发送buffer为同一块内存。也就是说,上游socket数据来了,本地socket自动发送这一块buffer的数据。效率真是高爆了。这块buffer数据还可以用内核调用splice()tee() 来达到分流和分离信号的目的。

btw sendfile() 是不行的,源必须是可以mmap的buffer,目标必须是个socket。

那么弱爆了的python可否跪舔这种高级特性呢?2.7和3.X里是可以的,因为现在PEP 3118统一了各种streaming object 的buffer protocol。只需要用一个叫memoryview的引用
就可以实现共享buffer而达到zero-copy的目的了。

C API见这里,python代码例子在这里,具体核心调用就是 file.readinto()socket.recv_into() 方法。具体代码留作读者课后练习。

Comments