While implementing a SOCKS proxy in Go, I ran into an issue which is better explained in details by Evan Klitzke in this post https://eklitzke.org/goroutines-nonblocking-io-and-memory-usage
In my case, each proxied connection costs two goroutines and two buffers in blocking read. For TCP connections the buffer size can be small (e.g. 2kb), so the overhead per proxied TCP connection is 8kb (2 x 2kb goroutine stack + 2 x 2kb read buffer). For UDP connections the buffer size must be large enough to hold the largest packet due to the nature of packet-oriented network, so the overhead per proxied UDP connection is 132kb (2 x 2kb goroutine stack + 2 x 64kb read buffer for largest UDP packet). Handling 10,000 UDP proxied connections requires at least 1.25GB memory, which is unnecessary if there's a way to poll I/O readiness and use a shared read buffer. I'm wondering if there's a better way other than calling syscall.Epoll/Kqueue to create custom poller? -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.