ip_conntrack_maxÖµµÄÒÉÎÊ
/proc/sys/net/ipv4/ip_conntack_max¿ØÖÆip_conntrack¸ú×ÙµÄ×î´óÁ¬½ÓÊý,µ«ÊǸÃÖµÉè³ÉºÜ´ó,Ïñ1000000,È»ºóÔÙʹÓÃiptables½øÐÐÁ¬½Ó״̬¸ú×Ù,¶ÔϵͳÓÐÓ°Ïì²»?ºÃÏóÕâ¸öÖµ¸ú״̬¸ú×Ù±íµÄhashÊýÓйØ,µ«ÉèÌ«´óµ½µ×Óкθ±×÷ÓÃ,»¹ÍûÖ¸µãÒ»¶þ. ÓÐÓ°Ïì, /proc ϵÄÖµ²»ÄÜûÓÐÀíÓɵÄËæÒâµ÷´ó, Ò»°ãÔì³ÉÄÚ´æÊ¹Óò»ºÏÀí.
ip_conntrack_max¶ÔϵͳÐÔÄܵÄÓ°Ïì¿É²Î¿¼ÕâÀï:[url]http://www.wallfire.org/misc/netfilter_conntrack_perf.txt[/url] ·Ò룺NetDC <fjdc AT 163 DOT com>
Èç¹ûÄúÓÐʲôºÃµÄÏë·¨¿ÉÒÔºÍÎÒ½»Á÷¡£
×ªÔØ×¢Ã÷³ö´¦£¬Ð»Ð»¡£
Netfilter conntrack ÐÔÄܵ÷Õû£¬v0.6
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Herv?Eychenne <rv _AT_ wallfire _DOT_ org>
ÕâÆªÎĵµËµÃ÷Á˶Ônetfilter conntrack£¨»¹ÓÐNAT£©ÐÔÄܵ÷ÕûʱÄã±ØÐëÖªµÀµÄһЩÊÂÇé¡£
±¾Îĵµ×îаæ¿ÉÒÔÔÚÏÂÃæÕâ¸öµØÖ·ÕÒµ½£º
[url]http://www.wallfire.org/misc/netfilter_conntrack_perf.txt[/url]
------------------------------------------------------------------------------
ÕâÀïÎÒÃÇ¿ÉÒÔµ÷ÕûÁ½¸ö²ÎÊý£º
£ÔÊÐíµÄ×î´ó¸ú×ÙÁ¬½ÓÌõÄ¿£¬ÔÚÕâÆªÎĵµÖÐÎÒÃǽÐ×÷CONNTRACK_MAX
£´æ´¢¸ú×ÙÁ¬½ÓÌõÄ¿ÁбíµÄ¹þÎ÷±íµÄ´óС£¬ÔÚÕâÆªÎĵµÖÐÎÒÃǽÐ×öHASHSIZE£¨ÏÂÃæÊÇÕâ¸ö½á¹¹µÄÃèÊö£©
CONNTRACK_MAXÊÇÔÚÄÚºËÄÚ´æÖÐnetfilter¿ÉÒÔͬʱ´¦ÀíµÄ¡°ÈÎÎñ¡±£¨Á¬½Ó¸ú×ÙÌõÄ¿£©¡£
Ò»¸ö¸ú×ÙÁ¬½ÓµÄÌõÄ¿ÊÇ´æ´¢ÔÚÒ»¸öÁ´½ÓÆðÀ´µÄÁбíµÄÒ»¸ö½ÚµãÉÏ£¬Ã¿¸öÁÐ±í¶¼ÊÇÒ»¸ö¹þÎ÷±íµÄÔªËØ¡£Òò´Ëÿ¸ö¹þÎ÷±íµÄÌõÄ¿£¨Ò²½ÐÒ»¸öͰ£bucket£©°üº¬ÁËÒ»¸öÁ´½ÓÆðÀ´µÄ¸ú×ÙÁ¬½ÓÌõÄ¿¡£
Òª·ÃÎÊÒ»¸öÌØ¶¨°üµÄ¸ú×ÙÁ¬½ÓÌõÄ¿£¬Äں˱ØÐ룺
£Õë¶ÔÒ»¸ö°üÖеÄÒѾ¶¨ÒåµÄһЩ×Ö·û¼ÆËã¹þÎ÷Öµ¡£ÕâÊÇÒ»¸ö²»¼ä¶ÏµÄ¼ÆËã¡£
Õâ¸ö¹þÎ÷Öµ¾Í»á±»µ±×÷¹þÎ÷±íµÄË÷ÒýÀ´Ê¹Ó㬶ø¸ú×ÙÁ¬½ÓÌõÄ¿µÄÁбí¾Í´æ´¢ÔÚÕâÀï¡£
£·´¸´µÄ²é¿´Á´½ÓÁбíÖеĸú×ÙÁ¬½ÓÌõÄ¿ÒÔÕÒµ½Æ¥ÅäµÄÄÇÒ»¸ö¡£
ÕâÊÇÒ»¸öºÄ×ÊÔ´µÄ²Ù×÷£¬ÒÀÀµÓÚÁбíµÄ´óС£¨Ò²ÒÀÀµÓÚÁбíÖб»²Ù×÷µÄ¸ú×ÙÁ¬½ÓÌõÄ¿µÄλÖã©¡£
¹þÎ÷±í°üº¬ÁËHASHSIZE´óСµÄÁ´½ÓÌõÄ¿¡£µ±ÌõÄ¿ÂúµÄʱºò£¨×ܵĸú×ÙÁ¬½ÓÌõÄ¿Êý´ïµ½ÁËCONNTRACK_MAX£©£¬ÀíÏë״̬Ï£¬Ã¿¸öÁÐ±í£¨ÔÚ×îÓÅ»¯µÄÌõ¼þÏ£©½«°üº¬´óÔ¼CONNTRACK_MAX/HASHSIZEµÄÌõÄ¿Êý¡£
²»¹ÜÄãÊÇ·ñÓÐÁ¬½Ó£¬¹þÎ÷±í¶¼½«Õ¼ÓÃÒ»¸ö¹Ì¶¨´óСµÄ·Ç½»»»ÄÚºËÄÚ´æ¡£µ«ÊÇ×î´óÁ¬½Ó¸ú×ÙÌõÄ¿»á¼ì²â×î¶à¿ÉÒÔ´æ´¢¶àÉÙÌõÄ¿£¨globally into the
linked lists£©£¬Ò²¾ÍÊÇ˵ËûÃÇ×î¶à¿ÉÒÔÕ¼ÓöàÉÙµÄÄÚºËÄÚ´æ¡£
ÕâÆªÎĵµ½«¸øÄãһЩ¹ØÓÚΪÁË´ïµ½×îºÃµÄnetfilter conntracking/NATϵͳÐÔÄÜ£¬ÈçºÎµ÷ÓÅHASHSIZEºÍCONNTRACK_MAXÖµµÄÌáʾ¡£
CONNTRACK_MAXºÍHASHSIZEµÄĬÈÏÖµ
============================================
Ò»°ãÀ´Ëµ£¬CONNTRACK_MAXºÍHASHSIZE¶¼»áÉèÖÃÔÚ¡°ºÏÀí¡±Ê¹ÓõÄÖµÉÏ£¬ÒÀ¾Ý¿ÉʹÓõÄRAMµÄ´óСÀ´¼ÆËãÕâ¸öÖµ¡£
CONNTRACK_MAXµÄĬÈÏÖµ
------------------------------
ÔÚi386¼Ü¹¹ÉÏ£¬CONNTRACK_MAX = RAMSIZE (ÒÔbytes¼Ç) / 16384 =
RAMSIZE (ÒÔMegaBytes¼Ç) * 64£¬
Òò´Ë£¬Ò»¸ö32λµÄ´ø512MÄÚ´æµÄPCÔÚĬÈÏÇé¿öÏÂÄܹ»´¦Àí512*1024^2/16384 = 512*64 = 32768¸ö²¢·¢µÄnetfilterÁ¬½Ó¡£
µ«ÊÇÕæÕýµÄ¹«Ê½ÊÇ£º
CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)
ÕâÀïxÊÇÖ¸ÕëµÄbitÊý£¬£¨ÀýÈ磬32»òÕß64bit£©
Çë×¢Ò⣺
£Ä¬ÈϵÄCONNTRACK_MAXÖµ²»»áµÍÓÚ128
£¶ÔÓÚ´øÓг¬¹ý1GÄÚ´æµÄϵͳ£¬CONNTRACK_MAXµÄĬÈÏÖµ»á±»ÏÞÖÆÔÚ65536£¨µ«ÊÇ¿ÉÒÔÊÖ¹¤ÉèÖóɸü´óµÄÖµ£©
HASHSIZEµÄĬÈÏÖµ
-------------------------
ͨ³££¬CONNTRACK_MAX = HASHSIZE * 8¡£ÕâÒâζ×Åÿ¸öÁ´½ÓµÄÁÐ±íÆ½¾ù°üº¬8¸öconntrackµÄÌõÄ¿£¨ÔÚÓÅ»¯µÄÇé¿ö²¢ÇÒCONNTRACK_MAX´ïµ½µÄÇé¿öÏ£©£¬Ã¿¸öÁ´½ÓµÄÁбí¾ÍÊÇÒ»¸ö¹þÎ÷±íÌõÄ¿£¨Ò»¸öͰ£©¡£
ÔÚi386¼Ü¹¹ÉÏ£¬HASHSIZE = CONNTRACK_MAX / 8 =
RAMSIZE (ÒÔbytes¼Ç) / 131072 = RAMSIZE (ÒÔMegaBytes¼Ç) * 8¡£
¾ÙÀýÀ´Ëµ£¬Ò»¸ö32λ¡¢´ø512MÄÚ´æµÄPC¿ÉÒÔ´æ´¢512*1024^2/128/1024 =
512*8 = 4096 ¸öͰ£¨Á´½Ó±í£©
µ«ÊÇÕæÕýµÄ¹«Ê½ÊÇ£º
HASHSIZE = CONNTRACK_MAX / 8 = RAMSIZE (ÒÔbytes¼Ç) / 131072 / (x / 32)
ÕâÀïxÊÇÖ¸ÕëµÄbitÊý£¬£¨ÀýÈ磬32»òÕß64bit£©
Çë×¢Ò⣺
£Ä¬ÈÏHASHSIZEµÄÖµ²»»áСÓÚ16
£¶ÔÓÚ´øÓг¬¹ý1GÄÚ´æµÄϵͳ£¬HASHSIZEµÄĬÈÏÖµ»á±»ÏÞÖÆÔÚ8192£¨µ«ÊÇ¿ÉÒÔÊÖ¹¤ÉèÖóɸü´óµÄÖµ£©
¶ÁÈ¡CONNTRACK_MAXºÍHASHSIZE
==================================
ÏÖÔÚͨ¹ý/procÎļþϵͳÎÒÃÇ¿ÉÒÔÔÚÔËÐÐʱ¶ÁÈ¡CONNTRACK_MAXµÄÖµ¡£
ÔÚLinux kernel 2.4.23°æ±¾Ç°£¬Ê¹Óãº
# cat /proc/sys/net/ipv4/ip_conntrack_max
ÔÚLinux kernel 2.4.23°æ±¾ºó£¬Ê¹Óãº
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
(¾ÉµÄ /proc/sys/net/ipv4/ip_conntrack_maxÊDz»½¨ÒéʹÓõÄ!)
µ±Ç°µÄHASHSIZE×ÜÊÇ¿ÉÒÔÔÚsyslogÐÅÏ¢ÖÐÕÒµ½£¨¶ÔÈκÎÒ»¸öÄں˰汾£©£¬Í°£¨Ò²¾ÍÊÇHASHSIZE£©µÄÊýÄ¿ÊÇÔÚip_conntrack³õʼ»¯µÄʱºòÏÔʾ³öÀ´µÄ¡£
¶ÔÓÚlinuxÄÚºË2.4.24ÒԺ󣬵±Ç°µÄHASHSIZEÖµ¿ÉÒÔÔÚÔËÐÐʱʹÓÃÏÂÃæµÄÃüÁî¶ÁÈ¡£º
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
ÐÞ¸ÄCONNTRACK_MAXºÍHASHSIZE
====================================
ĬÈϵÄCONNTRACK_MAXºÍHASHSIZEµÄÖµ¶¼»áÒòÖ÷»úµÄ²»Í¬¶ø²»Í¬£¬µ«Äã¿ÉÒÔÔÚÖ»×ö·À»ðǽµÄ¸ß¸ºÔصÄϵͳÉÏÔö¼ÓËûÃÇ¡£
Òò´ËCONNTRACK_MAXºÍHASHSIZEÖµÈç¹ûÐèÒªµÄ»°¿ÉÒÔÊÖ¹¤¸ü¸Ä¡£
¶ÁȡͰÊÇÒ»¸öÁ¬ÐøÐԵIJÙ×÷£¨ÎÒÃǵÄÐËȤÔÚÓڵõ½Ò»¸ö¹þÎ÷ÁÐ±í£©£¬Çë¼ÇµÃÄÚºËÐèÒª²»Í£µÄ±éÀúÒ»¸öÁ´½ÓµÄÁбíÈ¥²éÕÒÒ»¸ö¸ú×ÙÁ¬½ÓÌõÄ¿¡£Òò´ËÒ»¸öÁ´½ÓÁÐ±í£¨CONNTRACK_MAX/HASHSIZEµÄÖµÔÚÓÅ»¯µÄ״̬ϲ¢ÇÒ´ïµ½ÉÏÏÞ£©µÄƽ¾ùÖµ²»ÄÜÉèÖÃÌ«´ó¡£Õâ¸ö±ÈֵĬÈÏÖµÊÇ8£¨µ±ÖµÊÇ×Ô¶¯¼ÆËãµÄʱºò£©¡£
ÔÚϵͳÓÐ×ã¹»µÄÄÚ´æ²¢ÇÒÐÔÄÜÕæµÄºÜÖØÒªµÄʱºò£¬Äã¿ÉÒÔÊÔ×Åʹƽ¾ùÖµÊÇÒ»¸ö¸ú×ÙÁ¬½ÓÌõÄ¿ÅäÒ»¸ö¹þÎ÷Ͱ£¬ÕâÒâζ×ÅHASHSIZE = CONNTRACK_MAX¡£
ÉèÖÃCONNTRACK_MAX
---------------------
¸ú×ÙÁ¬½ÓµÄÌõÄ¿ÊÇ´æ´¢ÔÚÁ´½ÓµÄ±íÖеģ¬Òò´Ë×î´óµÄ¸ú×ÙÁ´½ÓÌõÄ¿£¨CONNTRACK_MAX£©¿ÉÒÔºÜÈÝÒ׵Ķ¯Ì¬µ÷Õû¡£
linuxÄÚºË2.4.23֮ǰ£¬Ê¹Óãº
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
linuxÄÚºË2.4.23Ö®ºó£¬Ê¹Óãº
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
ÕâÀï$CONNTRACK_MAXÊÇÒ»¸öÕûÊý¡£
ÉèÖÃHASHSIZE
----------------
ÒòΪÊýѧÉϵÄÔÒò£¬¹þÎ÷±íÕ¼Óй̶¨µÄ´óС¡£Òò´ËHASHSIZE±ØÐëÔÚ¹þÎ÷±í±»´´½¨ºÍ¿ªÊ¼Ìî³ä֮ǰ¾ÍÈ·¶¨¡£
ÔÚlinuxÄÚºË2.4.21֮ǰ£¬±ØÐëʹÓÃËØÊý×÷Ϊ¹þÎ÷±íµÄ´óС£¬¶øÇÒÒª±£Ö¤Õâ¸ö¹þÎ÷±íÄܹ»ÓÐЧ²¢Í¨Ó᣷ÇËØÊýµÄÆæÊý»òÕ߯äËûµÄÊýÖµ¶¼ÊÇÇ¿ÁÒ²»ÍƼöʹÓõģ¬ÒòΪÕâÑù¹þÎ÷µÄ·ÖÅä²»ÄÜ´ïµ½×îÓÅ»¯µÄ״̬¡£
´ÓlinuxÄÚºË2.4.21£¨»¹ÓÐ2.6Äںˣ©¸ú×ÙÁ¬½ÓʹÓÃjenkins2bËã·¨£¬ÕâÑù¾Í¿ÉÒÔʹÓÃËùÓеÄÊýÖµ£¬µ«ÊÇʹÓÃ2^n´Î·½ÔË×÷µÄ×îÓÐЧ¡£
Èç¹ûnetfilterµÄ¸ú×ÙÁ¬½ÓÊDZ»±àÒë½øÄÚºËÖе쬹þÎ÷±íµÄ´óС¾Í¿ÉÒÔÔÚ±àÒëµÄʱºòÉèÖ㬻òÕߣ¨2.6ÄÚºËÖ®ºó£©¿ÉÒÔ×÷Ϊһ¸öÆô¶¯Ñ¡Ïîip_conntrack.hashsize=$HASHSIZE¡£
Èç¹ûnetfilterµÄ¸ú×ÙÁ¬½ÓÊDZàÒë³ÉÒ»¸öÄ£¿é£¬¹þÎ÷±íµÄ´óС¿ÉÒÔÔÚ¼ÓÔØÄ£¿éµÄʱºòÉèÖã¬Ê¹ÓÃÏÂÃæµÄÃüÁ
# modprobe ip_conntrack hashsize=$HASHSIZE
ÕâÀï$HASHSIZEÊÇÒ»¸öÕûÊý¡£
Ò»¸öÀíÏëµÄÀý×Ó£ºÖ»×ö·À»ðǽµÄ»úÆ÷
------------------------------------
ÔÚÀíÏëµÄÀý×ÓÖУ¬ÄãÓÐһ̨»úÆ÷Ö»×ö°ü¹ýÂ˺ÍNAT£¨Ò²¾ÍÊÇ˵£¬»ù±¾ÉÏûÓÐÓû§¿Õ¼äµÄʹÓã¬ÖÁÉÙ²»»áÓÐÏó´úÀíÕâÑù»á²»¶ÏµÄºÄ·ÑÄÚ´æ¿Õ¼äµÄ¶«Î÷......£©
netfilter¸ú×ÙÁ¬½ÓʹÓõÄÄÚºËÄÚ´æ´óСÊÇ£º
size_of_mem_used_by_conntrack (ÒÔbytes¼Ç) =
CONNTRACK_MAX * sizeof(struct ip_conntrack) +
HASHSIZE * sizeof(struct list_head)
£ÕâÀsizeof(struct ip_conntrack)¿ÉÒÔÓкܴóµÄÇø±ð£¬ÒÀÀµÓÚ»úÆ÷µÄÌåϵ¼Ü¹¹£¬Äں˰汾ºÍ±àÒëʱ¼äµÄÅäÖá£ÒªÏëÖªµÀËüµÄ´óС£¬¿ÉÒԲ鿴ip_conntrack³õʼ»¯Ê±ºòkenelµÄÈÕÖ¾ÐÅÏ¢¡£sizeof(struct ip_conntrack)ÔÚi386¼Ü¹¹¡¢ 2.6.5ÄÚºËÉÏ´óÔ¼ÊÇ300bytes£¬µ«ÊÇÔÚ2.6.10µÄÄÚºËÉÏ£¬Õâ¸öÖµ¿ÉÒÔÔÚ352ÖÁ192bytesÖ®¼ä±ä»¯£¡
£sizeof(struct list_head) = 2 * size_of_a_pointer
ÔÚi386ÉÏ£¬size_of_a_pointerÊÇ4bytes¡£
Òò´ËÔÚi386£¬2.6.5ÄÚºËÉÏ£¬size_of_mem_used_by_conntrack´óÔ¼ÊÇCONNTRACK_MAX * 300 + HASHSIZE * 8 (bytes)¡£
Èç¹ûÎÒÃÇʹHASHSIZE = CONNTRACK_MAX£¨Èç¹ûÎÒÃǽ«´ó²¿·ÖµÄÄÚ´æÓÃÀ´×ö·À»ðǽµÄ¹¤×÷£¬²Î¼û¡°ÐÞ¸Ä CONNTRACK_MAXºÍHASHSIZE¡±²¿·Ö£©£¬ÔÚi386¼Ü¹¹¡¢2.6.5ÄÚºËÉÏ£¬ size_of_mem_used_by_conntrack´ó¸ÅÊÇCONNTRACK_MAX * 308 bytes¡£
ÏÖÔÚÎÒÃǼٶ¨ÄãʹÓÃ512MµÄÄÚ´æÄÃÀ´×öÒ»¸öÖ»×ö·À»ðǽµÄ»úÆ÷£¬²¢ÇÒʹÓÃ128MBÒÔÍâµÄÄÚ´æÀ´×ö¸ú×ÙÁ¬½Ó£¬¶ÔÓÚʹÓÃÖÕ¶Ëģʽֻ×ö·À»ðǽÀ´ËµÓ¦¸ÃÊÇ×ã¹»µÄ´óµÄ£¬ÀýÈ磺
Äã¿ÉÒÔͬʱÉèÖÃCONNTRACK_MAXºÍHASHSIZE´óÖÂÈçÏ£º
(512 - 128) * 1024^2 / 308 =~ 1307315 (instead of 32768 for CONNTRACK_MAX,
and 4096 for HASHSIZE by default)¡£
¶ÔÓÚlinux2.4.21£¨ºÍlinux2.6£©£¬¹þÎ÷Ëã·¨×îºÃʹÓá°2µÄ´Î·½¡±´óС£¨Ö®Ç°ÊÇʹÓÃËØÊý£©¡£
Òò´ËÔÚÕâÀïÎÒÃÇ¿ÉÒÔ½«CONNTRACK_MAXºÍHASHSIZEÉèÖóÉ1048576£¨2^20£©¡£
ÕâÑù£¬Äã¿ÉÒԴ洢ĬÈÏÖµ32±¶µÄ¸ú×ÙÁ¬½ÓÌõÄ¿£¬¶øÇÒ¿ÉÒԵõ½¸üºÃµÄ¸ú×ÙÁ¬½ÓÐÔÄÜ¡£
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
×îºó¸üУº2005Äê1ÔÂ20ÈÕ
ÐÞÕýÀúÊ·£º
Revision history:
0.6 Hashsize parameter can be set at boot time with Linux 2.6. Thanks to
Tobias Diedrich for pointing this out.
0.5 Added further notice about the varying length of the conntrack structure.
0.4 Since Linux 2.4.21, hash algorithm is happy with all sizes, not only
prime ones. However, power of 2 is best.
0.3 Various small precisions.
0.2 Information about Linux kernel versions and corresponding /proc entries.
(/proc/sys/net/ipv4/netfilter/ip_conntrack_{max,buckets}).
0.1 Initial writing, largely based on my discussions with Harald Welte
(netfilter maintainer) on the netfilter-devel mailing-list. Many thanks
to him!
Ò³:
[1]