百元建站,wordpress cdn 非插件,做博客网站要什么技术,河北恒山建设集团网站最近#xff0c;我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题#xff0c;并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中#xff0c;我发现了一些没有使用过的新可调参数。MongoDB配置甚至MongoDB本身也可以选择限制传…最近我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中我发现了一些没有使用过的新可调参数。MongoDB配置甚至MongoDB本身也可以选择限制传入连接的最大数量。默认为64k。# mongod.confnet:maxIncomingConnections: 999999请注意默认情况下MongoDB为每个传入的连接创建一个专用的工作线程。我想测试此默认值但我应该指出有一个相关设置更改为工作池模型。据推测这将允许大量的传入连接并使用更少的线程。请注意即使正式记录了此选项它仍被标记为实验性的net:serviceExecutor: adaptive但是对于我的测试我将为每个连接创建一个线程因此还需要以下所有配置…Linux配置为了正确设置ulimit我需要回过头来记住我在大学中学到的所有基本Unix原理一切都是文件。特别是就ulimit而言TCP / IP连接是打开的文件。由于历史原因nproc实际上是线程数。从历史上看Linux进程是单线程并发工作负载是多进程。线程从堆栈分配内存堆栈也具有最大大小。# Connections are files because in Unix everything is a file.echo ec2-user soft nofile 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard nofile 9999999 | sudo tee -a /etc/security/limits.conf# nproc is really number of threads.echo ec2-user soft nproc 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard nproc 9999999 | sudo tee -a /etc/security/limits.conf# Threads need memory from the stack.echo ec2-user soft stack 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard stack 9999999 | sudo tee -a /etc/security/limits.conf但是创建线程使用mmap从堆栈分配内存。并且在内核级别上有一个设置用于设置每个进程的最大映射内存块的最大数量该设置也必须增加echo 9999999 /proc/sys/vm/max_map_count# If you want to persist across rebootsecho vm.max_map_count9999999 | sudo tee -a /etc/sysctl.conf最终在基准客户端上我开始遇到TCP / IP的限制。在TCP协议中一个套接字用元组(本地地址本地端口远程地址远程端口)标识并且该元组在每个套接字中必须是唯一的。端口号的范围是1到65535。因此从一个基准客户端中我只能创建65535个传出连接。为了对更多的连接进行基准测试唯一的选择是拥有一个以上的客户端主机或至少一个客户端的IP地址。但是我没有走那么远。(在服务器端端口当然是众所周知的mongod端口27017。)令我惊讶的是默认情况下Linux甚至都不会使用TCP可能的全部65k端口。甚至必须对此进行配置echo 1024 65530 /proc/sys/net/ipv4/ip_local_port_range# If you want to persist across rebootsecho net.ipv4.ip_local_port_range 1024 65530 | sudo tee -a /etc/sysctl.conf这两个数字是最小和最大传出端口。请注意在服务器(基准客户端)上不需要此配置。EC2配置在AWS上我发现在尝试使用的M5系列EC2实例(最大为m5.2xlarge)上我只能创建32k连接和线程。使用完全相同的配置但是切换到c3.8xlarge实例类型我能够创建更多实例达到上述ip_local_port_range所规定的接近65k的限制。我尚未找到任何可以证实我对M5实例的观察的AWS文档。AWS支持人员也没有确认这一点。所以这对我来说仍然可能是一个错误。摘要因此这里是一个副本和可粘贴脚本中的所有步骤。这是为运行Amazon Linux 2的AWS实例专门构建的。您可能需要针对其他版本的Linux进行调整。特别是在Centos和RHEL上将用户名从更改ec2-user为root。# This assumes a fresh Linux host from standard Amazon Linux 2 images.# Adaptable to Centos/RHEL too.sudo sused -i .orig s/net\:/net\:\n maxIncomingConnections: 999999/ /etc/mongod.conf# Connections are files because in Unix everything is a file.echo ec2-user soft nofile 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard nofile 9999999 | sudo tee -a /etc/security/limits.conf# nproc is really number of threads.echo ec2-user soft nproc 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard nproc 9999999 | sudo tee -a /etc/security/limits.conf# Threads need memory from the stack.echo ec2-user soft stack 9999999 | sudo tee -a /etc/security/limits.confecho ec2-user hard stack 9999999 | sudo tee -a /etc/security/limits.conf# Threads allocate memory with mmapecho 9999999 /proc/sys/vm/max_map_count# If you want to persist across rebootsecho vm.max_map_count9999999 | sudo tee -a /etc/sysctl.conf# Needed for outgoing connections (on client)echo 1024 65530 /proc/sys/net/ipv4/ip_local_port_rangeecho net.ipv4.ip_local_port_range 1024 65530 | sudo tee -a /etc/sysctl.conf# Checks EC2 instance type but doesnt do anything about itcurl http://169.254.169.254/latest/meta-data/instance-type