关于ab压测的点点

##################

kernel: nf_conntrack: falling back to vmalloc:https://blog.csdn.net/TN947/article/details/85415481

关于连接跟踪的相关介绍:https://blog.csdn.net/u010472499/article/details/78292811

单机百万:https://blog.csdn.net/lijinqi1987/article/details/74545851

基于Locust、Tsung的百万并发秒杀压测案例[转] https://www.cnblogs.com/walter-chen/p/5485383.html

###########################

问题1:默认20000连接如何修改

https://blog.51cto.com/zhizhimao/2347849?source=dra   https://blog.51cto.com/lsxme/2048003  

apr-util致命错误:expat.h:没有那个文件或目录  https://blog.csdn.net/dn1115680109/article/details/80847924

源码编译安装:分别下载Apache httpd,apr,apr-util,pcre

http://httpd.apache.org/download.cgi

http://apr.apache.org/download.cgi

http://www.pcre.org/ https://ftp.pcre.org/pub/pcre/

2.安装:

把文件上传到服务器上:
--安装组件
tra   -zxvf httpd-2.4.38.tar.gz
tar -zxvf apr-1.6.5.tar.gz
cp -r apr-1.6.5 httpd-2.4.38/srclib/apr
cd apr-1.6.5
./configure --prefix=/usr/local/apr
make && make install
tar -zxvf apr-util-1.6.1.tar.gz
cp -r apr-util-1.6.1 httpd-2.4.38/srclib/apr-util
cd apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
tar -zxvf pcre-8.43.tar.gz
cd pcre-8.43
./configure --prefix=/usr/local/pcre --with-apr=/usr/local/apr
make && make install


--安装httpd:
cd httpd-2.4.38
./configure --with-included-apr --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre --enable-so --enable-mods-shared=most
make && make install

3.遇到问题:

(1)编译apr-util报错“致命错误:expat.h:没有那个文件或目录”

问题:缺少 expat库
解决方法 :yum install -y  expat-devel

(2)httpd make报错:collect2: error: ld returned 1 exit status

执行这两条命令的目的就是为了避免这个报错;
cp -r apr-1.6.5 httpd-2.4.38/srclib/apr
cp -r apr-util-1.6.1 httpd-2.4.38/srclib/apr-util

问题2:关于999893与999894之间相差55秒的有趣现象:

 

–第二次测试:999894

相关内容:关于高负载服务器Kernel的TCP参数优化https://www.cnblogs.com/94cool/p/5631905.html

net.ipv4.tcp_mem
内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看:
  #getconf PAGESIZE
  4096
  net.ipv4.tcp_mem = 196608       262144  393216
  第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预
  第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式
  第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory
  以上数值适用于4GB内存机器,对于8GB内存机器,建议用以下参数:
  net.ipv4.tcp_mem = 524288     699050  1048576  (TCP连接最多约使用4GB内存)16GB*4即为4194304
net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem
为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte
  net.ipv4.tcp_rmem = 4096        8192    4194304
  net.ipv4.tcp_wmem = 4096        8192    4194304
  第一个数字表示,为TCP连接分配的最小内存
  第二个数字表示,为TCP连接分配的缺省内存
  第三个数字表示,为TCP连接分配的最大内存
  一般按照缺省值分配,上面的例子就是读写均为8KB,共16KB,  4.0GB TCP内存能容纳的连接数,约为  4000MB/16KB = 250K = 25万
net.ipv4.tcp_max_orphans
最大孤儿套接字(orphan sockets)数,单位是个
net.ipv4.tcp_max_orphans = 65536
表示最多65536个
注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory
对于net.ipv4.tcp_max_orphans = 65536,当orphans达到32768个时,会报Out of socket memory,此时占用内存 32K*64KB=2048MB=2GB
  (每个孤儿socket可占用多达64KB内存),实际可能小一些

net.ipv4.tcp_orphan_retries
孤儿socket废弃前重试的次数,重负载web服务器建议调小
  net.ipv4.tcp_orphan_retries = 1
  设置较小的数值,可以有效降低orphans的数量(net.ipv4.tcp_orphan_retries = 0并不是想像中的不重试)

net.ipv4.tcp_retries2
活动TCP连接重传次数,超过次数视为掉线,放弃连接。缺省值:15,建议设为 2或者3.

net.ipv4.tcp_synack_retries
TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3
net.ipv4.tcp_fin_timeout = 30
FIN_WAIT状态的TCP连接的超时时间
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
TIME_WAIT状态的socket快速回收,循环使用
net.ipv4.tcp_max_syn_backlog = 4096
TCP连接SYN队列大小
net.core.netdev_max_backlog = 2048
网络设备的收发包的队列大小
net.ipv4.tcp_syncookies = 1
TCP SYN Cookies,防范DDOS攻击,防止SYN队列被占满

######其他############

1.epoll实现tcp百万级高并发测试源码:https://blog.csdn.net/u014220105/article/details/84849570

–百万并发配置记录:https://blog.csdn.net/max229max/article/details/87279330

–模拟百万tcp并发:https://blog.csdn.net/u011001084/article/details/54089182

epoll_SC.rar

2.lvs替代方案:https://blog.csdn.net/fgf00/article/details/80629295

3.lvs简单调优:

四,lvs简单调优
1,调整ipvs connection hash表的大小
IPVS connection hash table size,取值范围:[12,20]。该表用于记录每个进来的连接及路由去向的信息。连接的Hash表要容纳几百万个并发连接,任何一个报文到达都需要查找连接Hash表,Hash表是系统使用最频繁的部分。Hash表的查找复杂度为O(n/m),其中n为Hash表中对象的个数,m为Hash表的桶个数。当对象在Hash表中均匀分布和Hash表的桶个数与对象个数一样多时,Hash表的查找复杂度可以接近O(1)。
连接跟踪表中,每行称为一个hash bucket(hash桶),桶的个数是一个固定的值CONFIG_IP_VS_TAB_BITS,默认为12(2的12次方,4096)。这个值可以调整,该值的大小应该在 8 到 20 之间,详细的调整方法见后面。每一行都是一个链表结构,包含N列(即N条连接记录),这个N是无限的,N的数量决定了决定了查找的速度。
LVS的调优建议将hash table的值设置为不低于并发连接数。例如,并发连接数为200,Persistent时间为200S,那么hash桶的个数应设置为尽可能接近200x200=40000,2的15次方为32768就可以了。当ip_vs_conn_tab_bits=20 时,哈希表的的大小(条目)为 pow(2,20),即 1048576,对于64位系统,IPVS占用大概16M内存,可以通过demsg看到:IPVS: Connection hash table configured (size=1048576, memory=16384Kbytes)。对于现在的服务器来说,这样的内存占用不是问题。所以直接设置为20即可。
关于最大“连接数限制”:这里的hash桶的个数,并不是LVS最大连接数限制。LVS使用哈希链表解决“哈希冲突”,当连接数大于这个值时,必然会出现哈稀冲突,会(稍微)降低性能,但是并不对在功能上对LVS造成影响。
调整 ip_vs_conn_tab_bits的方法:
新版的linux kernel中的IPVS代码,允许调整 ip_vs_conn_bits 的值。而老kernel中的的IPVS代码则需要通过重新编译内核来进行调整。
在linux kernel发行版里,IPVS通常是以模块的形式编译的。
确认能否调整使用命令 modinfo -p ip_vs(查看 ip_vs 模块的参数),看有没有 conn_tab_bits 参数可用。假如可以用,那么说时可以调整,调整方法是加载时通过设置 conn_tab_bits参数:
在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为:
options ip_vs conn_tab_bits=20
查看
ipvsadm -l
如果显示IP Virtual Server version 1.2.1 (size=4096),则前面加的参数没有生效
modprobe -r ip_vs
modprobe ip_vs
重新查看
IP Virtual Server version 1.2.1 (size=1048576)
假如没有 conn_tab_bits 参数可用,则需要重新调整编译选项,重新编译。
Centos6.2,内核版本2.6.32-220.13.1.el6.x86_64,仍然不支持这个参数,只能自定义编译了。
另外,假如IPVS支持调整 ip_vs_conn_tab_bits,而又将IPVS集成进了内核,那么只能通过重启,向内核传递参数来调整了。在引导程序的 kernel 相关的配置行上,添加:ip_vs.conn_tab_bits=20 ,然后,重启。
或者重新编译内核。
2,linux系统参数优化
关闭网卡LRO和GRO
现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢;
解决方法,关闭LRO/GRO功能,命令:
ethtool -k eth0 查看LRO/GRO当前是否打开
ethtool -K eth0 lro off 关闭GRO
ethtool -K eth0 gro off 关闭GRO
禁用ARP,增大backlog并发数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.core.netdev_max_backlog = 500000  (在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目)
3,lvs自身配置
尽量避免sh算法
一些业务为了支持会话保持,选择SH调度算法,以实现 同一源ip的请求调度到同一台RS上;但 SH算法本省没有实现一致性hash,一旦一台RS down,,当前所有连接都会断掉;如果配置了inhibit_on_failure,那就更悲剧了,调度到该RS上的流量会一直损失;
实际线上使用时,如需 会话保持,建议配置 persistence_timeout参数,保证一段时间同一源ip的请求到同一RS上。
4,手动绑定linux系统网卡中断
lvs的并发过大,对网卡的利用很频繁,而对网卡的调优,也能增加lvs的效率。当前大多数系统网卡都是支持硬件多队列的,为了充分发挥多核的性能,需要手动将网卡中断(流量)分配到所有CPU核上去处理。默认情况下,网卡的所有的中断都是发送到一个默认的cpu上去处理的,而cpu中断需要等待时间,这样对于使用网卡频繁的服务,网卡性能就会成为瓶颈。
1,查看网卡中断:
# cat /proc/interrupts
2,绑定网卡中断到cpu
例如将中断52-59分别绑定到CPU0-7上:
[plain] view plaincopy
echo "1" > /proc/irq/52/smp_affinity  
echo "2" > /proc/irq/53/smp_affinity  
echo "4" > /proc/irq/54/smp_affinity  
echo "8" > /proc/irq/55/smp_affinity  
echo "10" > /proc/irq/56/smp_affinity  
echo "20" > /proc/irq/57/smp_affinity  
echo "40" > /proc/irq/58/smp_affinity  
echo "80" > /proc/irq/59/smp_affinity  
/proc/irq/${IRQ_NUM}/smp_affinity为中断号为IRQ_NUM的中断绑定的CPU核的情况。以十六进制表示,每一位代表一个CPU核。
        1(00000001)代表CPU0
        2(00000010)代表CPU1
        3(00000011)代表CPU0和CPU1
3,关闭系统自动中断平衡:
# service irqbalance stop
4,如果网卡硬件不支持多队列,那就采用google提供的软多队列RPS;
配置方法同硬中断绑定,例:
# echo 01 > /sys/class/net/eth0/queues/rx-0/rps_cpus
# echo  02 > /sys/class/net/eth0/queues/rx-1/rps_cpus

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据