百万级别长连接,并发测试指南

.net core高并发_百万级别长连接,并发测试指南 结尾有彩蛋哟!前言都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。本文有两个难点,我算不上完全解决。后端代码的性能.linux内核参数的优化.环境说明下面所有的测试机器都是基于open... 阅读详情
百万级别长连接,并发测试指南

原文链接:http://blog.51cto.com/youerning/2089930

前言

都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。

100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。

本文有两个难点,我算不上完全解决。 
- 后端代码的性能. 
- linux内核参数的优化.

环境说明

下面所有的测试机器都是基于openstack云平台,kvm虚拟化技术创建的云主机。

由于一个socket连接一般占用8kb内存,所以百万连接至少需要差不多8GB内存.

建立长连接主要是需要内存hold住内存,理论上只需要内存就足够了,不会消耗太多cpu资源, 相对内存而言.

而并发则对cpu很敏感,因为需要机器尽可能快的处理客户端发起的连接。

本文的并发主要指每秒处理的请求.

硬件配置

类型配置数量
后端16核32GB1
客户端2核4GB21

软件配置

类型长连接并发
后端python && geventgolang
客户端locust && pdshlocust & pdsh

IP地址

haproxy 192.168.111.111 
client-master 192.168.111.31 
client-slave 192.168.111.1[13-32]

测试步骤

系统调优

  • 最大文件打开数
  • 进程数
  • socket设置

客户端

在/etc/sysctl.conf加入以下内容

# 系统级别最大打开文件
fs.file-max = 100000

# 单用户进程最大文件打开数
fs.nr_open = 100000

# 是否重用, 快速回收time-wait状态的tcp连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

# 单个tcp连接最大缓存byte单位
net.core.optmem_max = 8192

# 可处理最多孤儿socket数量,超过则警告,每个孤儿socket占用64KB空间
net.ipv4.tcp_max_orphans = 10240

# 最多允许time-wait数量
net.ipv4.tcp_max_tw_buckets = 10240

# 从客户端发起的端口范围,默认是32768 61000,则只能发起2w多连接,改为一下值,可一个IP可发起差不多6.4w连接。
net.ipv4.ip_local_port_range = 1024 65535
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在/etc/security/limits.conf加入以下内容

# 最大不能超过fs.nr_open值, 分别为单用户进程最大文件打开数,soft指软性限制,hard指硬性限制
* soft nofile 100000
* hard nofile 100000
root soft nofile 100000
root hard nofile 100000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

服务端

在/etc/sysctl.conf加入以下内容

# 系统最大文件打开数
fs.file-max = 20000000

# 单个用户进程最大文件打开数
fs.nr_open = 20000000

# 全连接队列长度,默认128
net.core.somaxconn = 10240
# 半连接队列长度,当使用sysncookies无效,默认128
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syncookies = 0

# 网卡数据包队列长度  
net.core.netdev_max_backlog = 41960

# time-wait 最大队列长度
net.ipv4.tcp_max_tw_buckets = 300000

# time-wait 是否重新用于新链接以及快速回收
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 1

# tcp报文探测时间间隔, 单位s
net.ipv4.tcp_keepalive_intvl = 30
# tcp连接多少秒后没有数据报文时启动探测报文
net.ipv4.tcp_keepalive_time = 900
# 探测次数
net.ipv4.tcp_keepalive_probes = 3

# 保持fin-wait-2 状态多少秒
net.ipv4.tcp_fin_timeout = 15  

# 最大孤儿socket数量,一个孤儿socket占用64KB,当socket主动close掉,处于fin-wait1, last-ack
net.ipv4.tcp_max_orphans = 131072  

# 每个套接字所允许得最大缓存区大小
net.core.optmem_max = 819200

# 默认tcp数据接受窗口大小
net.core.rmem_default = 262144  
net.core.wmem_default = 262144  
net.core.rmem_max = 16777216  
net.core.wmem_max = 16777216

# tcp栈内存使用第一个值内存下限, 第二个值缓存区应用压力上限, 第三个值内存上限, 单位为page,通常为4kb
net.ipv4.tcp_mem = 786432 4194304 8388608
# 读, 第一个值为socket缓存区分配最小字节, 第二个,第三个分别被rmem_default, rmem_max覆盖
net.ipv4.tcp_rmem = 4096 4096 4206592
# 写, 第一个值为socket缓存区分配最小字节, 第二个,第三个分别被wmem_default, wmem_max覆盖
net.ipv4.tcp_wmem = 4096 4096 4206592
  • 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

在/etc/security/limits.conf加入一下内容

# End of file
root      soft    nofile          2100000
root      hard    nofile          2100000
*         soft    nofile          2100000
*         hard    nofile          2100000
  • 1
  • 2
  • 3
  • 4
  • 5

重启使上述内容生效

不愿意重启就使用以下命令

sysctl -p
  • 1

宿主机

一般宿主机都会启用防火墙,所以防火墙会记录每一条tcp连接记录,所以如果当虚拟机建立的tcp数量超过宿主机的防火最大记录数,则会drop掉后来的tcp.主要通过/etc/sysctl.conf下的这个配置项。

# 将连接改为200w+以满足单机100w长连接.
net.nf_conntrack_max=2048576
  • 1
  • 2

测试工具选取

locust

一个用python编写的非常出色的测试框架,满足大多数测试场景.内置http client, 可自定义client, 支持水平扩展.

下载安装参考: https://docs.locust.io/en/latest/index.html

pdsh

用于调试启动多个locust客户端以及一些批量操作.

下载安装使用参考: 
https://github.com/chaos/pdsh

http://kumu-linux.github.io/blog/2013/06/19/pdsh/

server脚本编写

长连接通过tcp协议测试, 借助gevent框架.

脚本如下

#coding: utf-8
from __future__ import print_function
from gevent.server import StreamServer
import gevent

# sleeptime = 60

def handle(socket, address):
    # print(address)
    # data = socket.recv(1024)
    # print(data)
    while True:
        gevent.sleep(sleeptime)
        try:
            socket.send("ok")
        except Exception as e:
            print(e)

if __name__ == "__main__":
    import sys
    port = 80
    if len(sys.argv) > 2:
        port = int(sys.argv[1])
        sleeptime = int(sys.argv[2])
    else:
        print("需要两个参数!!")
        sys.exit(1)
    # default backlog is 256
    server = StreamServer(('0.0.0.0', port), handle, backlog=4096)
    server.serve_forever()
  • 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

并发通过http协议测试,借助golang, 因为golang可以充分利用多核且效率高.

脚本如下

package main

import (
    // "fmt"
    "io"
    "log"
    "net/http"
    "os"
    "time"
)

type myHandler struct{}

func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // time.Sleep(time.Second * 1)
    io.WriteString(w, "ok")
}

func main() {
    var port string
    port = ":" + os.Args[1]

    srv := &http.Server{
        Addr:         port,
        Handler:      &myHandler{},
        ReadTimeout:  30 * time.Second,
        WriteTimeout: 30 * time.Second,
    }

    log.Fatal(srv.ListenAndServe())
}
  • 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

client脚本编写 
长连接脚本

#coding: utf-8
import time
from gevent import socket
from locust import Locust, TaskSet, events, task

class SocketClient(object):
    """
    Simple, sample socket client implementation that wraps xmlrpclib.ServerProxy and
    fires locust events on request_success and request_failure, so that all requests
    gets tracked in locust's statistics.
    """

    def __init__(self):
        # 仅在新建实例的时候创建socket.
        self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__connected = False

    def __getattr__(self, name):
        skt = self._socket

        def wrapper(*args, **kwargs):
            start_time = time.time()
            # 判断是否之前建立过连接,如果是则建立连接,否则直接使用之前的连接
            if not self.__connected:
                try:
                    skt.connect(args[0])
                    self.__connected = True
                except Exception as e:
                    total_time = int((time.time() - start_time) * 1000)
                    events.request_failure.fire(request_type="connect", name=name, response_time=total_time, exception=e)
            else:
                try:
                    data = skt.recv(1024)
                    # print(data)
                except Exception as e:
                    total_time = int((time.time() - start_time) * 1000)
                    events.request_failure.fire(request_type="recv", name=name, response_time=total_time, exception=e)
                else:
                    total_time = int((time.time() - start_time) * 1000)
                    if data == "ok":
                        events.request_success.fire(request_type="recv", name=name, response_time=total_time, response_length=len(data))
                    elif len(data) == 0:
                        events.request_failure.fire(request_type="recv", name=name, response_time=total_time, exception="server closed")
                    else:
                        events.request_failure.fire(request_type="recv", name=name, response_time=total_time, exception="wrong data: {}".format(data))

        return wrapper

class SocketLocust(Locust):
    """
    This is the abstract Locust class which should be subclassed. It provides an XML-RPC client
    that can be used to make XML-RPC requests that will be tracked in Locust's statistics.
    """

    def __init__(self, *args, **kwargs):
        super(SocketLocust, self).__init__(*args, **kwargs)
        self.client = SocketClient()

class SocketUser(SocketLocust):
    # 目标地址
    host = "192.168.111.30"
    # 目标端口
    port = 80
    min_wait = 100
    max_wait = 1000

    class task_set(TaskSet):
        @task(1)
        def connect(self):
            self.client.connect((self.locust.host, self.locust.port))
  • 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

并发脚本

#coding: utf-8
from __future__ import print_function
from locust import HttpLocust, TaskSet, task

class WebsiteUser(HttpLocust):
    host = "http://192.168.111.30"
    # 目标端口
    port = 80
    min_wait = 100
    max_wait = 1000

    class task_set(TaskSet):
        @task(1)
        def index(self):
            self.client.get("/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

监控工具选择 
netdata

通过本工具可以直观的感受到系统的各项指标的变化

效果图如下 
image
百万级别长连接,并发测试指南

下载安装参考:https://github.com/firehol/netdata/wiki/Installation

本机脚本

watch -n 1 "ss -s && uptime &&free -m"
  • 1

简单查看本机连接数,负载,内存情况。

效果图如下 
image

长连接测试步骤 
启动客户端 
- locust master

locust -f /root/loadtest/socket_load_backend.py --master
  • 1
  • locust slave
pdsh -w 192.168.111.1[13-32] "locust -f /root/loadtest/socket_load_backend.py --slave --master-host=192.168.111.31"
  • 1

注意: 在slave端一样需要又socket_load_backend.py文件.

启动后端

nohup python /root/loadtest/tcpserver.py 80 550 &> /var/log/tcpserver1.log &
  • 1

开始测试 
登陆locust的web页面: http://192.168.111.31:8089

开始参数如下. 
image

Number of users to simulate 
代表最终创建多少的用户.

Hatch rate (users spawned/second)代表每秒创建多少的用户

由上图可知,每秒2000个用户数增长,增长大盘100w需要500秒,所以在后端每个连接保持550秒,以保证至少550秒内达到100w连接.当建立一百万用户以后就会每隔一段时间执行自定义的任务,时间间隔在min_wait与max_wait时间范围内.

测试结果 
image

image

从面结果可以看出,一共完成了200w左右的请求, 每秒请求数量差不多在1800左右.然后负载在1左右,说明cpu资源差不多达到了100%.因为这里的后端是单进程的.再者内存使用量在11GB左右,还算合理.

并发测试步骤 
启动客户端 
- locust master

locust -f /root/loadtest/http_load_backend.py --master
  • 1
  • locust slave
pdsh -w 192.168.111.1[13-32] "locust -f /root/loadtest/http_load_backend.py --slave --master-host=192.168.111.31"


# 多新建一个终端再次执行以下命令,因为它是单线程的,所以启动的数量一般与cpu个数相等,而上面的长连接消耗的主要是内存,所以不需要多启动一倍的客户端
pdsh -w 192.168.111.1[13-32] "locust -f /root/loadtest/http_load_backend.py --slave --master-host=192.168.111.31"
  • 1
  • 2
  • 3
  • 4
  • 5

启动后可以发现有40个slave,效果如下.

image

启动后端

nohup go run go/src/server.go 80 &> /var/log/goServer.log &
  • 1

开始测试 
注意这地方的测试应该是1w 1.5w 2w的数量依次的往上加,即,第一次user用户数填10000,Hatch rate填10000,然后依次分别增加.

这里就贴最终的结果了.

image

测试结果 
image

image

从面结果可以看出,一共完成了10w左右的请求, 每秒请求数量差不多在16000左右.然后负载在9左右,远远没有想想中的强势…其中主要受两方面限制, 一是内核参数, 再者就是宿主机性能的限制.

而性能调优暂时不在这篇文章内容内,主要是积累还不够.再者本文主要是测试. 
而负载均衡器暂时还没看到满意的,所以并发到1.6w就算本文的结束了。

总结

工欲善其事必先利其器,动手之前应该选一件称手的工具,locust便是那件不错的工具,但是有了工具还要设定正确的目标,以及步骤,不然很难成功.这里算是抛砖引玉了吧.

不足之处

没有对吞吐量做测试,即服务端发送不同的文本大小,这里只是测试2字节的相应内容.

没有测试并发更高的情况下的100w长连接.

后记

之所以想写一篇大数量级的测试方式,是因为,网上大多数文章要么是给测试代码或者工具,要么是给一堆解释的不是很清楚的参数,再者就是只贴连接数的数量,如果只是达到这么多的连接,却不给出成功失败率,实在是有点耍流氓。

有意思的是这么强势的测试框架居然相关内容这么少,有空读读源码.

本文所有的代码可以在以下链接找到

https://github.com/youerning/blog/tree/master/locust-test

参考文档: 
Linux之TCPIP内核参数优化:

https://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html

理解 Linux backlog/somaxconn 内核参数:

https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/

Linux下Http高并发参数优化之TCP参数:

https://kiswo.com/article/1017

单台服务器百万并发长连接支持:

http://blog.youkuaiyun.com/mawming/article/details/51941771

结合案例深入解析orphan socket产生与消亡:

https://m.aliyun.com/yunqi/articles/91966

千万级别并发用户模拟软件 tcpburn.zip 千万级别并发用户模拟软件 tcpburn ,tcpburn是由网易自主研发的能够模拟千万级别并发用户的一个软件,目的是能够用较少的资源来模拟出... 立即下载

相关推荐

JMeter 之TCP服务器并发压力测试

JMeter 之TCP服务器并发压力测试,图文详细介绍,傻瓜式操作。

TCP Socket Client 测试工具,并发测试

TCP协议 Socket客户端测试程序。发送数据支持ASCII与16进制格式。创建终端,然后发送数据。可以模拟并发压力测试。

2632

MAIXCAM无线连接实战:5分钟搞定远程调试与代码烧录(避坑版)

本文提供了一份详细的MAIXCAM无线连接实战指南,帮助嵌入式视觉开发者快速配置远程调试与代码烧录。文章重点介绍了通过MaixHub IDE进行Wi-Fi配置、建立远程终端连接、使用SFTP进行文件传输以及管理自启动应用程序的完整流程,并针对IP地址变动、信号中断等常见问题提供了实用的避坑解决方案,旨在提升开发效率与灵活性。

weixin_29188043的博客 299

用locust测试tcp并发

用locust测试tcp并发

Mr_wilson_liu的博客 716

Hyper-V显卡直通实战:手把手解决Windows 11虚拟机错误码43(附完整参数配置)

本文详细解析了在Windows 11 Hyper-V虚拟机中配置显卡直通时遭遇错误码43的根源,并提供了从环境检查、核心PowerShell命令(如Set-VMGpuPartitionAdapter)配置到虚拟机内驱动替换的完整实战解决方案,帮助用户彻底解决显卡驱动无法加载的问题。

weixin_29238147的博客 906

【现代电路理论】【2】考尔法设计无源单口网络

夏 弥:其实你在冰面上看到鱼浮上来 明年冬天如果你还在那里,那鱼还是会上来换气 那时候你就可以带一把冰镐 把冰面砸开把鱼捞上来熬汤

痛苦的时候装出幸福相,这不是那么难做到的事 2888

【Linux】百万级别长连接,并发测试指南

前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。 100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。 本文有两个难点,我算不上完全解决。 后端代码的性能. linux内核参数的优化. 环境说明 下面所有的测试机器都是...

rong11417的博客 1878

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 368

python百万级并发_百万级别长连接,并发测试指南

前言都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。本文有两个难点,我算不上完全解决。后端代码的性能.linux内核参数的优化.环境说明下面所有的测试机器都是基于openstack云平...

weixin_32172693的博客 794

GEO优化内容营销策略:从规划到落地的全流程指南

GEO内容营销是通过地域化内容提升本地搜索排名、增加流量和转化率的策略。核心包括:构建本地用户画像,挖掘需求关键词;策划本地文化融合、案例研究等多样化内容;通过网站、社交媒体、本地KOL等渠道精准分发;优化本地关键词和视觉元素;监测数据并动态调整。案例显示,咖啡馆、工业企业和服装品牌通过本地化短视频、KOL合作及社群运营,显著提升了搜索排名、客流量和销售额。关键原则是内容本地化、精准分发、KOL合作、激励用户生成内容及数据驱动优化,实现高效本地市场渗透。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1331

关于 Nginx 监听地址 0.0.0.0 的详细解释

0.0.0.0在Nginx配置中表示监听服务器所有网络接口(包括公网IP、内网IP和本地回环地址),这是默认配置。当使用listen 80;时,Nginx会接受通过服务器任何IP地址的80端口访问请求。相比只监听特定IP,这种配置更通用,但也意味着服务会对外网开放,需注意安全风险。可通过netstat命令验证监听状态,显示0.0.0.0:80即表示正确配置。

weixin_43674738的博客 1567

dubbo是长连接还是短连接_百万级别长连接,并发测试指南

结尾有彩蛋哟!前言都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。本文有两个难点,我算不上完全解决。后端代码的性能.linux内核参数的优化.环境说明下面所有的测试机器都是基于open...

weixin_39729784的博客 683

倒立摆的PLC控制(模型分析+ SCL源代码)

首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆的运动方程。

RXXW_Dor的博客 3336

百万tcp并发测试

前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。 100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意,才有本文。 本文有两个难点,我算不上完全解决。 后端代码的性能. linux内核参数的优化. 环境说明 下面所有的测试机器都是...

thinker 4554

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2071

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HTTP百万级别长连接尝试及调优方法

HTTP长连接200万尝试及调优方法 对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一。这种应用常见于消息推送系统,也称为comet应用,比如聊天室或即时消息推送系统等。comet应用具体可见我之前的介绍,在此不多讲。对于这类系统,因为很多消息需要到产生时才推送给客户端...

caoliangbo的博客 866

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用Locust测试100W长连接

百万级别长连接,并发测试指南 出自:https://blog.51cto.com/youerning/2089930 前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试的流程以及工具倒是可以分享分享。也望指出不足之处。 100w的长连接实在算不上太难的事情,不过对于网上关于测试方法以及测试工具的相关文章实在不甚满意...

文山 2442

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

百万长连接,参数调优

其中服务端 IP、 服务端 Port 已经固定了 (就是监听的 TCP 程序),所以理论的链接数量上限取决于(客户端 IP * 客户端 Port)的组合数量了。短时间内打开大量网络(文件)链接,超过操作系统对单个进程允许打开的文件描述符(file descriptor)数量限制。综上所述,一个服务端的 TCP 网络应用,可以支持最大链接数量主要取决于其内存大小(内核参数都已经调优的情况下)。soft open files 是 Linux 系统参数,影响系统单个进程能够打开最大的文件句柄数量。

zhupy112的专栏 1229

java百万级tcp ip_不仅仅是百万级TCP长连接框架 t-io

t-io: 不仅仅是百万级TCP长连接框架t-io是基于jdk aio实现的易学易用、稳定、性能强悍、将多线程运用到极致、内置功能丰富的即时通讯框架(广义上的即时通讯,并非指im),字母 t 寓意talent。同类型的框架还有voovan、netty、mina、baseio等,不喜欢t-io的可以去尝试了解这几个,t-io对所有人按LGPL协议开源,但只服务于品行良好的开发人员!t-io在协议生态...

weixin_30611317的博客 890

百万并发压测后续

查看指定的端口 lsof -i:port 查看所有端口 netstat -aptn 通过lsof命令查看某个特定的进程打开的文件数 lsof -p 1296 | wc -l 在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来。 通过查看dmesg命令查看,发现大量nf_conntrack: table full, dropping packet 稳妥的临时处理办法: vi /etc/sysctl.conf net.nf_conntrack_max = 20971...

349

GoIM分布式架构终极指南:从拓扑结构到百万级并发部署

GoIM是一个基于Go语言构建的高性能即时通讯框架,专为大规模分布式场景设计。作为企业级实时消息推送解决方案,GoIM通过精巧的组件分离和服务发现机制,实现了真正意义上的水平扩展能力。无论你是需要构建聊天应用、直播弹幕系统,还是实时通知服务,GoIM的分布式架构都能为你提供坚实的技术支撑。 ## 🏗️ GoIM核心架构全景解析 GoIM采用分层架构设计,将连接管理、业务逻辑、消息分发和数据存

gitblog_00103的博客 685

一分钟了解阿里云产品:性能测试通过SLB保持百万级TCP连接C1M

一直以来,对SLB的转发性能到底如何比较好奇。于是,最近开了一个测试用的SLB来玩玩C1M,即我们能不能通过一个SLB来保持1百万个TCP长连接? 我的测试配置如下: 1个内网SLB,端口配置8000->8001, TCP按最小连接数转发。 3个后端server ECS,配置4核4G ram。 17个client ECS,配置1核2...

weixin_33894992的博客 732
上一篇: Mosquitto服务器日志分析总结
下一篇: HAProxy详细配置过程
王树民
博客等级 码龄10年 912粉丝 560原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值