最近,我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题,并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中,我发现了一些没有使用过的新可调参数。

MongoDB配置

甚至MongoDB本身也可以选择限制传入连接的最大数量。默认为64k。

# mongod.conf

net:

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.conf

echo "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.conf

echo "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.conf

echo "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 reboots

echo "vm.max_map_count=9999999" | 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 reboots

echo "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 su

sed -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.conf

echo "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.conf

echo "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.conf

echo "ec2-user hard stack 9999999" | sudo tee -a /etc/security/limits.conf

# Threads allocate memory with mmap

echo 9999999 > /proc/sys/vm/max_map_count

# If you want to persist across reboots

echo "vm.max_map_count=9999999" | sudo tee -a /etc/sysctl.conf

# Needed for outgoing connections (on client)

echo 1024 65530 > /proc/sys/net/ipv4/ip_local_port_range

echo "net.ipv4.ip_local_port_range = 1024 65530" | sudo tee -a /etc/sysctl.conf

# Checks EC2 instance type but doesn't do anything about it

curl http://169.254.169.254/latest/meta-data/instance-type

linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆相关推荐

  1. linux perl模块检测,Linux有问必答:如何用Perl检测Linux的发行版本

    提问:我需要写一个Perl程序,它会包含Linux发行版相关的代码.为此,Perl程序需要能够自动检测运行中的Linux的发行版(如Ubuntu.CentOS.Debian.Fedora等等),以及它 ...

  2. 手机怎么登虚拟服务器,如何用手机号登录云服务器

    如何用手机号登录云服务器 内容精选 换一换 本章节指导用户如何使用双因子认证.请参见:开启双因子认证功能.登录Linux主机使用PuTTY/Xshell登录云主机.登录时,请选择Keyboard In ...

  3. 在桌面上创建一个宽带连接服务器,win7系统怎么在桌面上创建宽带连接的快捷图标?...

    腾讯视频/爱奇艺/优酷/外卖 充值4折起 说到"宽带连接",每个上过网的人都记得,在刚去电信或联通开户后,电脑每一次上网就是要通过点击"宽带连接"这个图标后才能 ...

  4. 在桌面上创建一个宽带连接服务器,win7怎么在桌面上创建宽带连接图标 桌面上创建宽带连接教程...

    如果我们想要上网的话一定要进行宽带连接,除非你通过路由器或者其他共享,但是在路由器上的那台电脑也要配置宽带连接,如果系统重装了或由于个人操作引起一些文件丢失而使电脑上的桌面没有"宽带连接&q ...

  5. 在桌面上创建一个宽带连接服务器,win7在桌面上创建宽带连接快捷方式的方法...

    现如今大多数家庭都使用宽带拨号连接作为上网方式,也是最传统的连接上网方式,但是一些用户重装win7旗舰版系统后,发现桌面并没有宽带连接快捷方式,每次都要通过右下角的小图标连接宽带,这样操作起来比较麻烦 ...

  6. linux磁盘扩容_超详尽!Linux云服务器存储扩容实操

    导语 | 随着业务的发展,业务数据不停的增长,原有的磁盘空间可能会出现磁盘空间不够用的情况,因此,需要对磁盘空间进行扩容,以满足业务数据增长的需求.本文总结了Linux环境下云服务器存储扩容的三种方式 ...

  7. converter 无法查询活动linux源计算机,【VMware】Converter迁移linux系统虚拟机

    今天接到一个需求,迁移一台linux的业务系统到vCenter云管理平台,其中遇到一些问题,于是进行了排错,这个过程与大家分享,下面把整个步骤进行截图说明. 1. 首先,登录到VMware Conve ...

  8. Linux基础学习一:初步认识linux

    Linux引言 操作系统发展简介 Linux是和Windows类似的计算机操作系统.它们的作用都是充分的调度硬件资源并提供一个简单的使用入口.事实上,追本溯源操作系统主要分为2大门派:类unix操作系 ...

  9. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接 <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式 ...

最新文章

  1. Android 屏幕适配从未如斯简单(8月10日最终更新版)
  2. 检查oracle安装,oracle安装前环境检查
  3. 安装es怎么在后台运行_ES备份索引数据到阿里云OSS
  4. c++模板模式template
  5. 16_clickhouse,HDFS引擎,JDBC引擎
  6. jsf 开发_JSF开发人员应该知道的5种有用方法
  7. 最简单的基于FFmpeg的移动端样例:IOS 视频转码器
  8. Mr.J-- jQuery学习笔记(十七)--动画淡入淡出弹窗广告
  9. 客户和顾客是一个意思吗_履约保证金和投标保证金是一个意思吗?
  10. Visual Studio 2008 集成SP1补丁
  11. UML/ROSE学习笔记系列一:建模原理、概念
  12. 源码分析ElasticJob任务错过机制(misfire)与幂等性
  13. Study 3 —— Python运算符
  14. dnf时装补丁教程_【时装补丁制作】消灭伸手党!最详细的图文教程~
  15. 轻量级神经网络架构综述
  16. java poi word bookmarks_poi根据word/excel模板(书签)创建导出word/excel文档
  17. android连接打印机
  18. C语言阶段小项目(火车购票系统)
  19. Windows10 重装系统小白教程
  20. 2007年生日祝福:宝贝,谢谢您陪伴我走过人生风风雨雨,祝您2007年生日快乐!

热门文章

  1. 滤波 放电速度比充电慢 模电
  2. DataPipeline | PayPal庞姬桦:大数据在小微企业贷款上的运用
  3. jquery 快速入门二
  4. 【codevs2488】绿豆蛙的归宿
  5. CentOS6实现路由器功能
  6. 数据库基础知识——视图
  7. Nginx启动后无法访问页面
  8. 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
  9. scala语言的底层是java实现的_2020了,每个程序员都该学习的 5 种开发语言
  10. oracle跳过undo回滚段启动,[Oracle] 解析在没有备份的情况下undo损坏怎么办