一台主机,至多可以开启多少个线程

问题来源

最近在做服务器压力以及并发测试,因为是C/S模型,所以需要自己模拟客户端,需要运行大量的线程模拟并发,于是就碰到这个问题了。

另一个原因是,我在服务器中创建了一个线程池,我很想知道线程池的个数上限,从而更好的制定线程池动态增减的方法,所以也做了同样的测试。

首先分析32位linux系统

对32位系统来说,理论上的寻址范围是4G(2^32),但实际系统还要预留系统空间用于自身管理,一般来说真正的最大寻址范围都要小于4G。对于Linux来说,一个进程拥有的用户空间为0~0xBFFFFFFF,共3G,另外1G是内核空间;Windows的到0x7FFFFFFF,只有2G。(32位系统的寻址范围还可以扩大,应用某些扩展标准,例如PAE,最多能支持到16G到64G不等。但这个情况不在我的讨论范围)。

一个LInux进程在用户态最多访问3G内存,每个线程必须占用特定大小的堆栈空间(stack size),这个因素使32位系统创建的线程数不可能超过n=3G/StackSize 
注:Stack Size可以用ulimit -s查看,单位是k,同时这个size是可以设定的。

我的系统是ubuntu12.04,这个size是8192k

所以大致上一个用户进程最对创建360左右的线程数。

Create thread 303
can‘t create thread: Cannot allocate memory

然后考虑64位系统

因为64位系统,没有寻址范围的限制,所以理论上,可以创建的线程数应该是几乎无限的,除非其他条件限制。

但是,我在实际测试中,当创建线程数达到7500左右的时候,出现错误。但是原因一直没能找到。
Create thread 7545
can‘t create thread: Resource temporarily unavailable

如何更改线程栈的大小

1.使用ulimit -s size命令,将线程栈大小临时设置成size,单位是k2.使用pthread_attr_setstacksize在程序中改变线程栈大小,单位是byte3.运行程序的时候,是否以root运行,可以避免被限制资源

在64位linux下,增加线程数的方法试验

1.使用ulimit -s,将线程栈大小改为1024k,最大创建线程数仍为7500,没有改变,说明64位系统栈空间大小已经不再是限制了。
2.以root权限运行程序,发现线程可以运行数目达到1.5w级别,确实权限高,受限小一些,但是有风险。
3.使用ulimit -s改变线程栈大小,然后再以root权限运行,结果与2一样,说明线程栈空间不是限制因素。
 

服务器并发的测试方法

1.首先编写了客户端程序,并进行单个测试,ok!
2.将客户端程序改写成多线程的,一个客户端运行100个线程(线程是1中的程序改装)
3.shell脚本并行运行2中的客户端100次,那么就可以创造100*100的并发了。
4.一台机子可开启的线程数受限,考虑N台同时运行,那么并发测试就可以N*100*100了。
5.如果客户程序非长连接,还可以让客户端线程反复跑起来!
时间: 2024-11-03 01:30:33

一台主机,至多可以开启多少个线程的相关文章

配置使用4台主机实现12台主机的集群

一.说明 因为电脑只能开四个虚拟机,于是使用4台虚拟机模拟12台主机. 如下图所示: 图解: 1.四台虚拟机均使用 CentOS 6.5 系统: 2.前端使用 keepalived给haproxy作高可用,keepalived为双主模型,前端两主机互为主从,两虚拟IP为:172.16.36.100.172.16.36.200: 3.前端haproxy给后端的web服务器作负载均衡: 4.前端DNS用于keepalived两虚拟IP作轮询解析域名,域名为:www.wubin.com: 5.事实上,

Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信

注:本篇博客同样不针对于伸手党,源代码等等的我不会完全公开的,此篇文章写出来为大家的网络编程或者课程设计提供一定的思路.. 好,本次我们需要完成的任务是: 完成两台主机通过中间主机的数据通信(网络层) 增加基于IP地址的转发功能 增加网络层封装 其实最主要的就是基于IP地址的转发功能,网络层的封装其实我们在初级功能中就已经做好了. 首先,实验的思路是A通过中间主机B向C发送数据.那么B则作为一个路由器,B要监听两个网卡,一个网卡发来的数据通过另一个网卡发出去. 示意图如下: A---------

<两台主机之间日志的同步>

首先要知道两台主机之间同步文件udp虽然安全性不高,但是它的同步速率远远高于tcp.这点是不可否认的. 我们以简单的为例: 服务端: 允许别的主机可以把日志同步到自己的主机上来. # vim /etc/rsyslog.conf $ModLoad imudp  //开启udp协议,添加udp模块. $UDPServerRun 514 /etc/init.d/rsyslog restart 重启使配置生效 # tail -f /var/log/messages  //动态监控日志 客户端 把日志往哪

rsync + inotify 实现两台主机间文件的同步备份

前面一篇博文介绍了rsync的主要使用及工作于服务器模式下的安装.配置.inotify是Linux内核中监控文件系统的一种事件机制,它负责监视文件系统的变化.如文件的创建.修改.删除等,并以事件的方式通知给应用程序.inotify-tools是一个基于内核的inotify机制为用户提供实现对文件系统的事件进行监控功能的应用程序组件. inotify实现的对文件系统监视的事件: IN_ACCESS:文件被访问 IN_MODIFY:文件被修改 IN_ATTRIB,文件属性被修改 IN_CLOSE_W

VMerre虚拟机vmnet2(nat)网络的详细讲解和两台虚拟机一台主机的实验

VMWERE虚拟机下的vmnet2(nat)网络的知识点及实验 环境:VMwareWorkstation 10.0.3 build-1895310,物理机win7 作用:实现3台主机间的通信,可以相互ping通 在VMwere的虚拟网络中,当装上虚拟主机后,默认安装有3块虚拟网卡,vmnet0,vmnet1,vmnet2 1.1虚拟机网络 1.2物理主机上的网络连接 如图1-2所示,当在1-1添加了相应的网络后,就会在物理主机的网络连接上出现相应的虚拟网卡,这些虚拟网卡可以根据需要修改名称 如图

怎么用一个显示器来显示和控制两台主机

要实现用一套键盘鼠标显示器来控制两台主机,方法很简单,只需要一个小型的设备来帮助——两个端口的KVM切换器.两个端口的KVM切换器.KA1302 是一个2口线控USB KVM切换器,使用者可将主装置放于桌面下,通过按键Scroll-Lock或通过其外接一个切换按键保留于桌面,即可简单且快速地切换电脑. 工具/原料 一个两口KVM切换器KA1302 一条按键线 在开始安装前,请确认你将连接的所有设备的电源已关闭为避免安装过程造成设备损坏,请先确认所要连接的设备均已适当接地. 将键盘.显示器和鼠标连

让两台主机通过四个路由器互通

让两台主机通过四个路由器互通 网络拓扑图如下: 环境准备:需要在vmware虚拟机中克隆6台虚拟机,每台系统环境为centos6.9 ,每台分配的最小内存为256M. R1,R2,R3,R4 这四台主机需要开启路由转发功能:vim /etc/sysctl.confnet.ipv4.ip_forward = 1sysctl -piptables -F克隆机需要重新更改网卡的名字.1.cat /etc/udev/rules.d/70-persistent-net.rules 2.将上述文件中的mac

oracle linux6操作系统oracle11.2.0.4数据库从一台主机A(ora11g)到另一台主机B(ora02)的迁移过程

oracle linux6操作系统oracle11.2.0.4数据库从一台主机A(ora11g)到另一台主机B(ora02)的迁移过程 A生成pfile文件并关闭数据库 [[email protected] ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Fri Jan 1 17:25:12 2016 Copyright (c) 1982, 2013, Oracle.  All rights reserved. SQL>

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统) 前言 由于学校课程实验的要求,特意需要搭建hadoop的完全分布式系统,所以自己就蛋疼的配了,可惜关于MAC系统的Hadoop搭建材料太少,而且真正的基于校园网的配置基本上没有(基本是在一台电脑上进行,因此当在多台电脑上运行会有许多bug),因此这里想要能够将自己搭的过程想要分享给大家,可能有些配置的解释没有那么全面,所以希望大家见谅?? 环境 基于Mac OSX 10.12.4(Sierra).Ubuntu