| Title: Port of the week: mbuffer | |
| Author: Solène | |
| Date: 31 May 2016 | |
| Tags: portoftheweek networking | |
| Description: | |
| This Port of the week is a bit special because sadly, the port isn't | |
| available on OpenBSD. The port is **mbuffer** (which you can find in | |
| misc/mbuffer). | |
| I discovered it while looking for a way to enhance one of my network | |
| stream scripts. I have some scripts that get a dump of a postgresql | |
| base through SSH, copy it from stdin to a file with tee and send it | |
| out to the local postgres, the command line looks like | |
| $ ssh remote-base-server "pg_dump my_base | gzip -c -f -" | gunzip | |
| -f | tee dumps/my_base.dump | psql my_base | |
| I also use the same kind of command to receive a ZFS snapshot from | |
| another server. | |
| But there is an issue, the end server is relatively slow, postgresql | |
| and ZFS will eat lot of data from stdin and then it will stop for | |
| sometimes writing on the disk, when they are ready to take new data, | |
| it's slow to fill them. This is where **mbuffer** takes places. This | |
| tool permit to add a buffer that will take data from stdin and fill | |
| its memory (that you set on the command line), so when the slowest | |
| part of the command is ready to take data, mbuffer will empty its | |
| memory into the pipe, so the slowlest command isn't waiting to get | |
| filled before working again. | |
| The new command looks like that for a buffer of 300 Mb | |
| ssh remote-base-server "pg_dump my_base | gzip -c -f -" | gunzip | |
| -f | tee dumps/my_base.dump | mbuffer -s 8192 -m 300M | psql my_base | |
| mbuffer also comes with a nice console output, showing | |
| - bandwith in | |
| - bandwith out | |
| - percentage/consumption of memory filled | |
| - total transfered | |
| in @ 1219 KiB/s, out @ 1219 KiB/s, 906 MiB total, buffer 0% full | |
| In this example the server is too fast so there is no wait, the buffer | |
| isn't used (_0% full_). | |
| mbuffer can also listen on TCP, unix socket and have a lot of | |
| parameters that I didn't try, if you think that can be useful for you, | |
| just go for it ! | |