百万并发 - ashorefish/-software-test GitHub Wiki

操作文档: linux配置(最好客户端和服务端都配置成一样的) /etc/security/limits.conf

  • soft nofile 20000
  • hard nofile 20000 /etc/pam.d/login session required /lib/security/pam_limits.so 64bit系统则为session required /lib64/security/pam_limits.so

/etc/security/limits.d/90-nproc.conf

  • soft nofile 100000
  • hard nofile 100000

/etc/sysctl.conf kernel.shmall = 4294967296 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 5000 65000 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_max_tw_buckets = 5000 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries =2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_rmem = 4096 4096 16777216 net.ipv4.tcp_wmem = 4096 4096 16777216 net.ipv4.tcp_mem = 786432 2097152 3145728 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_fin_timeout = 30 net.nf_conntrack_max = 655360 fs.file-max=1000000

sysctl –p sysctl –w net.ipv4.route.flush=1

ulimit –s 5120 ulimit –n 200000 echo 120000 > /proc/sys/kernel/threads-max echo 600000 > /proc/sys/vm/max_map_count echo 200000 > /proc/sys/kernel/pid_max echo 222222 > /proc/sys/fs/file-max echo 222222 > /proc/sys/nr_open

ifconfig eth0:1 10.10.10.12 netmask 255.255.255.0 up ifconfig eth0:1 down

启动主控:(10.10.10.10) locust –f 1002_tcp_1.py –master

启动从机:(可以手工启动,也可以脚本启动) #!/bin/bash sed -i 's/ADDR1=("10.10.10.11",0)/ADDR1=("10.10.10.12",0)/g' 1002_tcp_1.py nohup locust -f 1002_tcp_1.py --slave --master-host=10.10.10.10 >1.log &

sleep 5s

sed -i 's/ADDR1=("10.10.10.12",0)/ADDR1=("10.10.10.13",0)/g' 1002_tcp_1.py nohup locust -f 1002_tcp_1.py --slave --master-host=10.10.10.10 >2.log &

我: 脚本 #!/usr/bin/env python

coding:utf-8

import socket import time import json import base64 import random from locust import Locust, TaskSet, events, task import traceback recvLen = 1024 def to_send(sock,senddata1): try: sock.send(senddata1) try: recvdata1 = sock.recv(recvLen) return recvdata1 except Exception as ex: total_time = 60 events.request_failure.fire(request_type="TCP", name="send", response_time=total_time, exception=ex) #print "recv error" + str(ex) except IOError as ex: total_time = 60 events.request_failure.fire(request_type="TCP", name="send", response_time=total_time, exception=ex) #print "send error" + str(ex)

def to_connect(ADDR): tcpClickSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) start_time = time.time() ADDR1=("10.10.10.12",0) tcpClickSock.bind((ADDR1)) try: tcpClickSock.connect(ADDR) total_time = int((time.time() - start_time) * 1000) events.request_success.fire(request_type="tcpsocket", name="connect", response_time=total_time, response_length=0) except socket.error as ex: total_time = int((time.time() - start_time) * 1000) events.request_failure.fire(request_type="tcpsocket", name="connect", response_time=total_time, exception=ex) tcpClickSock.close() tcpClickSock = None except socket.timeout as ex: total_time = 30 events.request_failure.fire(request_type="tcpsocket", name="connect", response_time=total_time, exception=ex) tcpClickSock.close() tcpClickSock = None return tcpClickSock 我: class WebsiteUser(Locust): host = "10.10.10.10" port = 9090 min_wait = 50000 max_wait = 59000 #seq_num = (x for x in range(1000,9999)) class task_set(TaskSet): def on_start(self): num = 9090 vstr = "10.10.10.11" ADDR = (vstr,num) self.sock = to_connect(ADDR) self.seq = 0 self.deviceid = "MC120000000000000000000000000000" self.PIN = "PIN12000000000000000000000000000" #self.key = self.PIN[0:16] #self.iv = self.PIN[16:] #print self.key,self.iv count = 0 while True: timestamp = str(int(time.time()*1000)) str2 = {"code": 1002, "data": "MTIzNDU2Nzg5MA==", "deviceId": "MC120000000000000000000000000000"} str3 = json.dumps(str2) #print "json data:",str3 send_data2 = "CTS%s\r\n"%str3 recvdata1 = None start_time = time.time() recvdata1 = to_send(self.sock,send_data2) res_time = int((time.time() - start_time) * 1000) if recvdata1 is not None: events.request_success.fire(request_type="TCP", name="req_1002", response_time=res_time, response_length=0) else: events.request_failure.fire(request_type="TCP", name="req_1002", response_time=res_time, exception="response error") self.seq = self.seq + 1 time.sleep(300) if self.seq > 65535: self.seq = 0 @task def index(self): pass

if name == 'main': user = WebsiteUser() user.run()

工具 locust