Hi,

memory settings are gone from startup.conf. As I already mentioned, those were 
pointless anyway as the tables now reside in main heap. Translation hash 
buckets are calculated automatically based on max sessions and max users 
parameters.

Thanks,
Klement

> On 26 Nov 2020, at 21:50, Damjan Marion via lists.fd.io 
> <dmarion=me....@lists.fd.io> wrote:
> 
> Will leave that to NAT folks to comment… They have multiple tables and 
> they are two per thread…
> 
> — 
> Damjan
> 
> > On 26.11.2020., at 20:27, Marcos - Mgiga <mar...@mgiga.com.br> wrote:
> > 
> > Of course.
> > 
> > Since I intend to implement VPP as a deterministic CGN gateway I have some 
> > parameters regarding to nat config, for example: translation hash buckets, 
> > translation hash memory , user hash buckets and user hash memory to be 
> > configured in startup.conf.
> > 
> > In this context I would like to know how do I give the right value to those 
> > parameters.
> > 
> > 
> > Thanks
> > 
> > Marcos
> > 
> > 
> > -----Mensagem original-----
> > De: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> Em nome de Damjan Marion via 
> > lists.fd.io
> > Enviada em: quinta-feira, 26 de novembro de 2020 16:17
> > Para: Marcos - Mgiga <mar...@mgiga.com.br>
> > Cc: Elias Rudberg <elias.rudb...@bahnhof.net>; vpp-dev@lists.fd.io
> > Assunto: Re: RES: [vpp-dev] NAT memory usage problem for VPP 20.09 compared 
> > to 20.05 due to larger translation_buckets value
> > 
> > 
> > Sorry, I don’t understand your question. Can you elaborate further?
> > 
> > --
> > Damjan
> > 
> >> On 26.11.2020., at 20:05, Marcos - Mgiga <mar...@mgiga.com.br> wrote:
> >> 
> >> Hello,
> >> 
> >> Taking benefit of the topic, how you suggest to monitor if translation 
> >> hash bucket value has an appropriate value? What about translation hash 
> >> memory, user hash buckets and user hash memory ?
> >> 
> >> How do I know if I increase or decrease those values?
> >> 
> >> Best Regards
> >> 
> >> Marcos
> >> 
> >> -----Mensagem original-----
> >> De: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> Em nome de Damjan Marion 
> >> via lists.fd.io Enviada em: quinta-feira, 26 de novembro de 2020 14:53
> >> Para: Elias Rudberg <elias.rudb...@bahnhof.net>
> >> Cc: vpp-dev@lists.fd.io
> >> Assunto: Re: [vpp-dev] NAT memory usage problem for VPP 20.09 compared 
> >> to 20.05 due to larger translation_buckets value
> >> 
> >> 
> >> Dear Elias,
> >> 
> >> Let me try to explain a bit underlying mechanics.
> >> Let’s assume your target number of sessions is 10M and we are talking 
> >> about 16byte key size.
> >> That means each hash entry (KV) is 24 bytes (16 bytes key and 8 bytes 
> >> value).
> >> 
> >> In the setup you were mentioning, with 1<<20 buckets, your will need to 
> >> fit 10 KVs into each bucket.
> >> Initial bihash bucket holds 4 KVs and to accomodate 10 keys (assuming that 
> >> hash function gives us equal distribution) you will need to grow each 
> >> bucket 2 times. Growing means doubling bucket size.
> >> So at the end you will have 1<<20 buckets where each holds 16 KVs.
> >> 
> >> Math is:
> >> 1<<20 * (16 * 24 /* KV size in bytes */  + 8 /*bucket header size*/) Which 
> >> means 392 MB of memory.
> >> 
> >> If you keep target number of 10M sessions, but you increase number of 
> >> buckets to 1 << 22 (which is roughly what formula bellow is trying to do) 
> >> you end up with the following math:
> >> 
> >> Math is:
> >> 1<<22 * (4 * 24 /* KV size in bytes */  + 8 /*bucket header size*/) Which 
> >> means 416 MB of memory.
> >> 
> >> So why 2nd one is better. Several reasons:
> >> 
> >> - in first case you need to grow each bucket twice, that means 
> >> allocating memory for the new bucket,  copying existing data from the 
> >> old bucket and putting old bucket to the free list. This operation 
> >> increases  key insertion time and lowers performance
> >> 
> >> - growing will likely result in significant amount of old buckets 
> >> sitting in the free list  and they are effectively wasted memory 
> >> (bihash tries to reuse that memory but at some point  there is no 
> >> demand anymore for smaller buckets)
> >> 
> >> - performance-wise original bucket (one which first 4 KVs) is collocated 
> >> with bucket header.
> >> This is new behaviour Dave introduced earlier this year (and I think it is 
> >> present in 20.09).
> >> Bucket collocated with header means that there is no dependant 
> >> prefetch needed as both header  and at least part of data sits in the same 
> >> cacheline. This significantly improveslookup performance.
> >> 
> >> So in general, for best performance and optimal memory usage, number of 
> >> buckets should be big enough so it unlikely grow with your target number 
> >> of KVs. rule of thumb would be rounding target number of entries to closer 
> >> power-of-2 value and then dividing that number with 2.
> >> For example, for 10M entries first lower power-of-2 number is 1<<23 (8M) 
> >> and first higher is 1<<24 (16M).
> >> 1<<23 is closer, when we divide that by 2 we got 1<<22 (4M) buckets.
> >> 
> >> Hope this explains….
> >> 
> >> —
> >> Damjan
> >> 
> >> 
> >>> On 26.11.2020., at 17:54, Elias Rudberg <elias.rudb...@bahnhof.net> wrote:
> >>> 
> >>> Hello VPP experts,
> >>> 
> >>> We are using VPP for NAT44 and are currently looking at how to move 
> >>> from VPP 20.05 to 20.09. There are some differences in the way the 
> >>> NAT plugin is configured.
> >>> 
> >>> One difficulty for us is the maximum number of sessions allowed, we 
> >>> need to handle large numbers of sessions so that limit can be 
> >>> important for us. For VPP 20.05 we have used "translation hash 
> >>> buckets 1048576" and then the maximum number of sessions per thread 
> >>> becomes 10 times that because of this line in the source code in 
> >>> snat_config():
> >>> 
> >>> sm->max_translations = 10 * translation_buckets;
> >>> 
> >>> So then we got a limit of about 10 million sessions per thread, which 
> >>> we have been happy with so far.
> >>> 
> >>> With VPP 20.09 however, things have changed so that the maximum 
> >>> number of sessions is now configured explicitly, and the relationship 
> >>> between max_translations_per_thread and translation_buckets is no 
> >>> longer a factor of 10 but instead given by the 
> >>> nat_calc_bihash_buckets()
> >>> function:
> >>> 
> >>> static u32
> >>> nat_calc_bihash_buckets (u32 n_elts)
> >>> {
> >>> return 1 << (max_log2 (n_elts >> 1) + 1); }
> >>> 
> >>> The above function corresponds to a factor of somewhere between 1 and
> >>> 2 instead of 10. So, if I understood this correctly, for a given 
> >>> maximum number of sessions, the corresponding translation_buckets 
> >>> value will be something like 5 to 10 times larger in VPP 20.09 
> >>> compared to how it was in VPP 20.05, leading to significantly 
> >>> increased memory requirement given that we want to have the same 
> >>> maximum number of sessions as before.
> >>> 
> >>> It seems a little strange that the translation_buckets value would 
> >>> change so much between VPP versions, was that change intentional? The 
> >>> old relationship "max_translations = 10 * translation_buckets" seems 
> >>> to have worked well in practice, at least for our use case.
> >>> 
> >>> What could we do to get around this, if we want to switch to VPP 
> >>> 20.09 but without reducing the maximum number of sessions? If we were 
> >>> to simply divide the nat_calc_bihash_buckets() value by 8 or so to 
> >>> make it more similar to how it was earlier, would that lead to other 
> >>> problems?
> >>> 
> >>> Best regards,
> >>> Elias
> >>> 
> >>> 
> >>> 
> >> 
> >> 
> >> 
> >> 
> >> 
> > 
> 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#18168): https://lists.fd.io/g/vpp-dev/message/18168
Mute This Topic: https://lists.fd.io/mt/78535814/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to