| Title: Bandwidth management in go-IPFS | |
| Author: Solène | |
| Date: 18 April 2021 | |
| Tags: ipfs | |
| Description: | |
| # Introduction | |
| In this article I will explain a few important parameters for the | |
| reference IPFS node server go-ipfs in order to manage the bandwidth | |
| correctly for your usage. | |
| # Configuration File | |
| The configuration file of go-ipfs is set by default to | |
| $HOME/.ipfs/config but if IPFS_PATH is set it will be | |
| $IPFS_PATH/.config | |
| # Tweaks | |
| There are many tweaks possible in the configuration file, but there are | |
| pros and cons for each one so I can't tell you what values you want. I | |
| will rather explain what you can change and in which situation you | |
| would want it. | |
| ## Connections number | |
| By default, go-ipfs will keep a number of connections to peers between | |
| 600 and 900 and new connections will last at least 20 seconds. This | |
| may totally overwhelm your router to have to manage that quantity of | |
| TCP sessions. | |
| The HighWater will define the maximum sessions you want to exist, so | |
| this may be the most important setting here. On the other hand, the | |
| LowWater will define the number of connections you want to keep all the | |
| time, so it will drain bandwidth if you keep it high. | |
| I would say if you care about your bandwidth usage, keep the LowWater | |
| low like 50 and have the HighWater quite high and a short GracePeriod, | |
| this will allow go-ipfs to be quiet when unused but responsive (able to | |
| connect to many peers to find a content) when you need it. | |
| Documentation about Swarm.ConnMgr | |
| ## DHT Routing | |
| IPFS use a distributed hash table to find peers (it's the common way to | |
| proceed in P2P networks), but your node can act as a client and only | |
| fetch the DHT from other peer or be active and distribute it to other | |
| peer. | |
| If you have a low power server (CPU) and that you are limited in your | |
| bandwidth, you should use the value "dhtclient" to no distribute the | |
| DHT. You can configure this in the configuration file or use | |
| --routing=dhtclient in the command line. | |
| Documentation about Routing.type | |
| ## Reprovider | |
| ### Strategy | |
| This may be the most important choice you have to make for your IPFS | |
| node. With the Reprovider.Strategy setting you can choose to be part | |
| of the IPFS network and upload data you have locally, only upload data | |
| you pinned or upload nothing. | |
| If you want to actively contribute to the network and you have enough | |
| bandwidth, keep the default "all" value, so every data available in | |
| your data store will be served to clients over IPFS. | |
| If you self host data on your IPFS node but you don't have much | |
| bandwidth, I would recommend setting this value to "pinned" so only the | |
| data pinned in your IPFS store will be available. Remember that pinned | |
| data will never be removed from the store by the garbage collector and | |
| files you add to IPFS from the command line or web GUI are | |
| automatically pinned, the pinned data are usually data we care about | |
| and that we want to keep and/or distribute. | |
| Finally, you can set it to empty and your IPFS node will never upload | |
| any data to anyone which could be consider as unfair in a peer to peer | |
| network but under some quota limited or high latency connection it | |
| would make sense to not upload anything. | |
| Documentation about Reprovider.Strategy | |
| ### Interval | |
| While you can choose what kind of data you want your node to relay as a | |
| part of the IPFS network, you can choose how often your node will | |
| publish the content of the data hold in its data store. | |
| The default is 12 hours, meaning every 12 hours your node will publish | |
| the list of everything available for upload to the other peers. If you | |
| care about bandwidth and your content doesn't change often, you can | |
| increase this value, on the other hand if you may want to publish more | |
| often if your data store is rapidly changing. | |
| If you don't want to publish your content, you can set it to "0", then | |
| you would still be able to publish it manually using the IPFS command | |
| line. | |
| Documentation about Reprovider.Interval | |
| ## Gateway management | |
| If you want to provide your data over a public gateway, you may not | |
| want everyone to use this gateway to download IPFS content because of | |
| legal concerns, resource limits or you simply don't want that. | |
| You can set Gateway.NoFetch to make your gateway to only distribute | |
| files available in the node data store. Meaning it will act as an | |
| http·s server for your own data but the gateway can't be used to get | |
| any other data. It's a convenient way to publish content over IPFS and | |
| make it available from a gateway you trust while keeping control over | |
| the data relayed. | |
| Documentation about Gateway.NoFetch | |
| # Conclusion | |
| There are many settings here for various use case. I'm running an IPFS | |
| node on a dedicated server but also another one at home and they have a | |
| very different configuration. | |
| My home connection is limited to 900 kb/s which make IPFS very | |
| unfriendly to my ISP router and bandwidth usage. | |
| Unfortunately, go-ipfs doesn't provide an easy way to set download and | |
| upload limit, that would be very useful. |