LVS
lvs-users
Google
 
Web LinuxVirtualServer.org

Performance degradation due to slab object size increase

To: "LinuxVirtualServer.org users mailing list." <lvs-users@xxxxxxxxxxxxxxxxxxxxxx>
Subject: Performance degradation due to slab object size increase
Cc: Horms <horms@xxxxxxxxxxxx>
Cc: Julian Anastasov <ja@xxxxxx>
From: Roberto Nibali <ratz@xxxxxxxxxxxx>
Date: Sun, 11 Mar 2007 10:46:19 +0100
Hello guys,

I've been helping with debugging a high traffic web site that deploys LVS_DR and is hitting IPVS limits :(. We've got to re-think our statements about IPVS being as fast or close to routing speed. Also CPU L1 cache is getting in our way, with Intel pushing those lousy dual/quad-core CPUs. They run with 16KB shared i/d-cache cross CPU (avg cache miss close to 1%!) and this is just not enough anymore to handle the slab cache lookup for sites with a high number of packets per second. I haven't been able to measure the DTLB invalidation rate but I suspect it high enough. And it seems that the bucket size of the hash table is also not so insignificant than anticipated and calculated before (around 2001/02 before switching to Jenkins hash).

I'll share the details hopefully before I leave for my sabbatical.

Just one question: When did IPVS fatten to a 256 byte slab object size for struct ip_vs_conn? This is fatal! (Joe will need to rewrite about 1432 pages of his Howto :)). Seriously: We need to put ip_vs_conn on a diet. What about the idea of the comment at the end of the ip_vs_conn structure definition in ../include/net/ip_vs.h:

       /* Note: we can group the following members into a structure,
           in order to save more space, and the following members are
           only used in VS/NAT anyway */
struct ip_vs_app *app; /* bound ip_vs_app object */ void *app_data; /* Application private data */
        struct ip_vs_seq        in_seq;         /* incoming seq. struct */
        struct ip_vs_seq        out_seq;        /* outgoing seq. struct */
};

How big is struct ip_vs_conn actually? It's only a 256 byte object since we must be slightely bigger than 128 bytes and do a HW_CACHE_ALIGN on kmem_cache_create().

Please comment if you find time. Thanks and best regards,
Roberto Nibali, ratz
--
echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq' | dc

<Prev in Thread] Current Thread [Next in Thread>
  • Performance degradation due to slab object size increase, Roberto Nibali <=