测试环境:
1 2 3 4 |
三台linux机器 centos 3.10 192.168.6.177 docker 192.168.6.178 docker mysql 192.168.6.179 docker |
uat发布测试,三台机器各自30G内存,每台机器大约承载 15个容器,每台机器都有一个注册中心(Eurka),三台机器的Eurka组成一个集群。
因为178机器有安装数据库,且内存使用较多,差不多mysql已经使用了56%的内存(16G)。剩下的内存(14G)所以不足以运行15个容器,所以先决定运行一半8个,后来发现第八个容器根本起不来,资源已经到了极限。就只启动了7个容器。
177,179,分别拉好15个容器后,开始操作178启动容器,当拉下启动3个容器的时候。Eurka的端口还可以访问,当拉下7个容器的时候,就不可以访问了。然后删了4个容器,Eurka又可以访问,导致其他2台机器的微服务,连接178的Eurkal老是超时,报错!


查看内核参数
1 |
sysctl -a |
解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
net.ipv4.ip_forward = 1 #启用ip转发功能 net.core.somaxconn = 10240 #TCP侦听队列大小 net.core.netdev_max_backlog = 262144 #当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。。 net.core.wmem_default = 8388608 #发送套接字缓冲区大小的默认值(以字节为单位)。 net.core.rmem_default = 8388608 #接收套接字缓冲区大小的默认值(以字节为单位)。 net.core.rmem_max = 16777216 #接收套接字缓冲区大小的最大值(以字节为单位)。 net.core.wmem_max = 16777216 #发送套接字缓冲区大小的最大值(以字节为单位)。 net.ipv4.route.gc_timeout = 20 #路由缓存刷新频率, 当一个路由失败后多长时间跳到另一个默认是300 net.ipv4.ip_local_port_range = 1025 65535 #被动侦听端口范围 net.ipv4.ip_local_reserved_ports = 8000-20000 #预留端口避免被占用 net.ipv4.tcp_retries2 = 5 #表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。 net.ipv4.tcp_fin_timeout = 30 #对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。 net.ipv4.tcp_syn_retries = 1 #表示本机向外发起TCP SYN连接超时重传的次数,不应该高于255;该值仅仅针对外出的连接,对于进来的连接由tcp_retries1控制。 net.ipv4.tcp_synack_retries = 1 #服务器SYN+ACK报文重试次数,尽快释放等待资源 net.ipv4.tcp_timestamps = 0 #经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。0表示不再检查时间戳 net.ipv4.tcp_tw_recycle = 0 #!!!!!!!容器NAT之类的千万不要设置为1,NAT设备后面的用户上网,发出的TPC/IP时间戳不连续,造成服务端丢弃连接。 net.ipv4.tcp_tw_reuse = 1 #当开启了net.ipv4.tcp_tw_reuse时,并且之前使用了TCP timestadmp选项(用于PAWS)时,才允许重用TIME_WAIT套接字。 net.ipv4.tcp_keepalive_time = 120 #如果在该参数指定的秒数内,TCP连接一直处于空闲,则内核开始向客户端发起对它的探测,看他是否还存活着; net.ipv4.tcp_keepalive_probes = 3 #内核发起对客户端探测的次数,如果都没有得到相应,那么就断定客户端不可达或者已关闭,内核就关闭该TCP连接,释放相关资源; net.ipv4.tcp_keepalive_intvl = 15 #以该参数指定的秒数为时间间隔,向客户端发起对它的探测; net.ipv4.tcp_max_tw_buckets = 200000 #可能会出现两种异常情况: #① 对端服务器发完最后一个 Fin 包,没有收到当前服务器返回最后一个 Ack,又重发了 Fin 包,因为新的 TimeWait 没有办法创建 ,这个连接在当前服务器上就消失了,对端服务器将会收到一个 Reset 包。因为这个连接是明确要关闭的,所以收到一个 Reset 也不会有什么大问题。(但是违反了 TCP/IP 协议) #② 因为这个连接在当前服务器上消失,那么刚刚释放的端口可能被立刻使用,如果这时对端服务器没有释放连接,当前服务器就会收到对端服务器发来的 Reset 包。如果当前服务器是代理服务器,就可能会给用户返回 502 错误。(这种异常对服务或者用户是有影响的) net.ipv4.tcp_max_orphans = 3276800 #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128 net.ipv4.tcp_max_syn_backlog = 262144 #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉 net.ipv4.tcp_wmem = 8192 131072 16777216 net.ipv4.tcp_rmem = 32768 131072 16777216 # 增加TCP最大缓冲区大小 net.ipv4.tcp_mem = 94500000 915000000 927000000 #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 |
Q生产
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
net.ipv4.tcp_slow_start_after_idle=0 net.core.rmem_max=16777216 fs.inotify.max_user_watches=1048576 kernel.softlockup_all_cpu_backtrace=1 kernel.softlockup_panic=1 fs.file-max=2097152 fs.nr_open=2097152 fs.inotify.max_user_instances=8192 fs.inotify.max_queued_events=16384 vm.max_map_count=262144 net.core.netdev_max_backlog=16384 net.ipv4.tcp_wmem=4096 12582912 16777216 net.core.wmem_max=16777216 net.core.somaxconn=32768 net.ipv4.ip_forward=1 net.ipv4.tcp_max_syn_backlog=8096 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-arptables=1 net.ipv4.tcp_rmem=4096 12582912 16777216 vm.swappiness=0 kernel.sysrq=1 net.ipv4.neigh.default.gc_stale_time=120 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 net.ipv4.tcp_max_tw_buckets=5000 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_synack_retries=2 net.ipv6.conf.lo.disable_ipv6=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.all.forwarding=0 net.ipv4.ip_local_port_range=1024 65535 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_probes=10 net.ipv4.tcp_keepalive_intvl=30 net.nf_conntrack_max=25000000 net.netfilter.nf_conntrack_max=25000000 net.netfilter.nf_conntrack_tcp_timeout_established=180 net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait=12 net.ipv4.tcp_timestamps=0 net.ipv4.tcp_orphan_retries=3 fs.may_detach_mounts=1 kernel.pid_max=4194303 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fin_timeout=1 vm.min_free_kbytes=262144 kernel.msgmnb=65535 kernel.msgmax=65535 kernel.shmmax=68719476736 kernel.shmall=4294967296 kernel.core_uses_pid=1 net.ipv4.neigh.default.gc_thresh1=0 net.ipv4.neigh.default.gc_thresh2=4096 net.ipv4.neigh.default.gc_thresh3=8192 net.netfilter.nf_conntrack_tcp_timeout_close=3 net.ipv4.conf.all.route_localnet=1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
net.ipv4.ip_forward=1 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.accept_source_route=0 kernel.sysrq=1 kernel.core_uses_pid=1 net.ipv4.tcp_syncookies=1 fs.file-max=2097152 fs.nr_open=2097152 vm.swappiness=0 vm.max_map_count=262144 vm.overcommit_memory=1 kernel.sem=5010 641280 5010 128 kernel.pid_max=4194303 kernel.msgmnb=65535 kernel.msgmax=65535 kernel.shmmax=68719476736 kernel.shmall=4294967296 net.ipv4.tcp_max_tw_buckets=5000 net.ipv4.tcp_sack=1 net.ipv4.tcp_window_scaling=1 net.ipv4.tcp_mem=786432 1697152 1945728 net.ipv4.tcp_rmem=4096 12582912 16777216 net.ipv4.tcp_wmem=4096 12582912 16777216 net.core.wmem_default=8388608 net.core.rmem_default=8388608 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.core.netdev_max_backlog=16384 net.core.somaxconn=32768 net.ipv4.tcp_max_orphans=3276800 net.ipv4.tcp_max_syn_backlog=8096 net.ipv4.tcp_syn_retries=1 net.ipv4.tcp_synack_retries=2 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fin_timeout=1 net.ipv4.tcp_keepalive_time=600 net.ipv4.ip_local_port_range=1024 65535 net.ipv4.neigh.default.gc_stale_time=120 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 sunrpc.tcp_slot_table_entries=256 net.ipv4.tcp_slow_start_after_idle=0 fs.inotify.max_user_watches=1048576 kernel.softlockup_all_cpu_backtrace=1 kernel.softlockup_panic=1 fs.inotify.max_user_instances=8192 fs.inotify.max_queued_events=16384 net.ipv4.tcp_timestamps=0 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-arptables=1 vm.min_free_kbytes=262144 net.ipv4.neigh.default.gc_thresh1=0 net.ipv4.neigh.default.gc_thresh2=4096 net.ipv4.neigh.default.gc_thresh3=8192 net.ipv4.conf.default.arp_announce=2 net.ipv6.conf.lo.disable_ipv6=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv4.tcp_keepalive_probes=10 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_orphan_retries=3 net.nf_conntrack_max=25000000 net.netfilter.nf_conntrack_max=25000000 net.netfilter.nf_conntrack_tcp_timeout_established=180 net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait=12 net.netfilter.nf_conntrack_tcp_timeout_close=3 net.ipv4.conf.all.route_localnet=1 |
RockyLinux与Centos8 以下这几项参数修改为:否则集群无法对外转发
1 2 3 4 5 |
net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 net.ipv4.tcp_timestamps=1 net.ipv4.tcp_slow_start_after_idle=1 net.ipv4.conf.all.route_localnet=0 |
1 2 3 4 5 |
sed -i 's/net.ipv4.conf.all.rp_filter=0/net.ipv4.conf.all.rp_filter=1/' /etc/sysctl.conf sed -i 's/net.ipv4.conf.default.rp_filter=0/net.ipv4.conf.default.rp_filter=1/' /etc/sysctl.conf sed -i 's/net.ipv4.tcp_timestamps=0/net.ipv4.tcp_timestamps=1/' /etc/sysctl.conf sed -i 's/net.ipv4.tcp_slow_start_after_idle=0/net.ipv4.tcp_slow_start_after_idle=1/' /etc/sysctl.conf sed -i 's/net.ipv4.conf.all.route_localnet=1/net.ipv4.conf.all.route_localnet=0/' /etc/sysctl.conf |
- 本文固定链接: https://www.yoyoask.com/?p=4259
- 转载请注明: shooter 于 SHOOTER 发表