Up to Main Index                          Up to Journal for December, 2015

                    JOURNAL FOR MONDAY 28TH DECEMBER, 2015
______________________________________________________________________________

SUBJECT: Improved networking
   DATE: Mon 28 Dec 18:03:03 GMT 2015

Due to it being the holiday season things have been a bit quiet. However I've
still been busy working away on WolfMUD.

In my last journal entry[1] I posted some memory usage figures for the new
networking code. I wasn't very happy with the results I was seeing, especially
after about 4,000 players had connected. So I went back and debugged the code
some more and twiddled a few knobs. Here are the before and after results for
8,192 connected players:


                    #Players  Max Alloc   Max Heap Objects
            Before:  8,192      944Mb        260,687
            After:   8,192       14Mb        208,448


Now that is one heck of a difference! Only 14Mb for 8192 players. I then
pushed the server to 64,500. That is the maximum with only minor fiddling of
the networking configuration[2] and using only a single client IP address:


                    #Players  Max Alloc   Max Heap Objects
                     64,500      112Mb      1,608,168


The results were very encouraging and not too shabby at all :)

Most of the memory savings are due to switching from bufio.Scanner to
bufio.NewReader. bufio.Scanner - upto Go 1.5 - uses a 64k buffer per scanner.
For 8,192 clients that's 8,192 * 64Kb = 524,288Kb or 512Mb just for buffers. I
did notice that in the Go 1.6 beta you can now set the scanner buffer size
using Scanner.Buffer. At the moment I'm not using the 1.6 beta so I switched
to a bufio.Reader and used NewReaderSize to set the buffer size.

For WolfMUD we only need a small input buffer, I chose 80 bytes - one line on
a "standard" 80x24 terminal. The total space for the Reader buffers is now
8,192 * 80 bytes = 655,360 bytes or 640Kb. I also switched to 80 bytes for the
network read buffers and 24*80 or 1,920 bytes for the network write buffers.
The network buffers don't change the reported memory usage as they are handled
in the kernel network stack and not in Go. I think they are usually both set to
4Kb for read and write.

Looking at this post I might need to write a handy network setup and tuning
guide for performance...

Also related to networking, I have a working solution for broadcasting
messages to multiple locations. Once that is complete it should be time to
update the public dev branch and go multiplayer :)

--
Diddymus

  [1] See: 18.html

  [2] My machine already has limits for the number of open files raised and
      net.ipv4.ip_local_port_range set to "1024 65535" to increase the number
      of available ports.


  Up to Main Index                          Up to Journal for December, 2015