Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LINUX最大线程数及最大进程数

LINUX最大线程数及最大进程数

作者头像
全栈程序员站长
发布于 2022-07-15 06:02:22
发布于 2022-07-15 06:02:22
4.6K0
举报

大家好,又见面了,我是全栈君

查看最大线程数:

cat /proc/sys/kernel/threads-max

ulimit

User limits – limit the use of system-wide resources.

Syntax ulimit [-acdfHlmnpsStuv] [limit]

Options

-S Change and report the soft limit associated with a resource. -H Change and report the hard limit associated with a resource.

-a All current limits are reported. -c The maximum size of core files created. -d The maximum size of a process’s data segment. -f The maximum size of files created by the shell(default option) -l The maximum size that may be locked into memory. -m The maximum resident set size. -n The maximum number of open file descriptors. -p The pipe buffer size. -s The maximum stack size. -t The maximum amount of cpu time in seconds. -u The maximum number of processes available to a single user. -v The maximum amount of virtual memory available to the process.

ulimit provides control over the resources available to the shell and to processes started by it, on systems that allow such control.

If limit is given, it is the new value of the specified resource. Otherwise, the current value of the soft limit for the specified resource is printed, unless the `-H’ option is supplied.

When setting new limits, if neither `-H’ nor `-S’ is supplied, both the hard and soft limits are set.

Values are in 1024-byte increments, except for `-t’, which is in seconds, `-p’, which is in units of 512-byte blocks, and `-n’ and `-u’, which are unscaled values.

The return status is zero unless an invalid option is supplied, a non-numeric argument other than unlimited is supplied as a limit, or an error occurs while setting a new limit.

ulimit is a bash built in command.

Ulimit命令 设置限制 可以把命令加到profile文件里,也可以在/etc/security/limits.conf文件中定义 限制。 命令参数 -a 显示所有限制 -c core文件大小的上限 -d 进程数据段大小的上限 -f shell所能创建的文件大小的上限 -m 驻留内存大小的上限 -s 堆栈大小的上限 -t 每秒可占用的CPU时间上限 -p 管道大小 -n 打开文件数的上限 -u 进程数的上限 -v 虚拟内存的上限 除可用Ulimit命令设置外,也可以在/etc/security/limits.conf文件中定义限制。 domino type item value domino是以符号@开头的用户名或组名,*表示所有用户,type设置为hard or soft。item指 定想限制的资源。如cpu,core nproc or maxlogins。value是相应的限制值。

系统限制默认值

[root@flyinweb ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 32764 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 32764 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

[root@flyinweb ~]# lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch Distributor ID: CentOS Description: CentOS release 5.2 (Final) Release: 5.2 Codename: Final

linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX

这个限制可以在 /usr/include/bits/local_lim.h 中查看

对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源

这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M

可以写一段简单的代码验证最多可以创建多少个线程

int main() { int i = 0; pthread_t thread; while (1) { if (pthread_create(&thread, NULL, foo, NULL) != 0) return; i ++; printf(“i = %d\n”, i); } }

试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN

在 nptl 上最多可以创建 382 个线程,之后就会返回 ENOMEM

这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。

那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程 http://www.cnblogs.com/roucheng/ 为了突破内存的限制,可以有两种方法

1) 用 ulimit -s 1024 减小默认的栈大小 2) 调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小

要注意的是,即使这样的也无法突破 1024 个线程的硬限制,除非重新编译 C 库

相关内容:

一、2.4内核与2.6内核的主要区别 在 2.4内核的典型系统上(AS3/RH9),线程是用轻量进程实现的,每个线程要占用一个进程ID,在服务器程序上,如果遇到高点击率访问,会造成进程表 溢出,系统为了维护溢出的进程表,会有间歇的暂停服务现象,而2.6内核就不会发生由于大量线程的创建和销毁导致进程表溢出的问题

二、线程结束必须释放线程堆栈 就 是说,线程函数必须调用pthread_exit()结束,否则直到主进程函数退出才释放,特别是2.6内核环境,线程创建速度飞快,一不小心立刻内存被 吃光,这一点反倒是2.4内核环境好,因为2.4内核创建的是进程,而且线程创建速度比2.6内核慢几个数量级。特别提醒,在64位CPU,2.6内核创 建线程的速度更加疯狂,要是太快的话,加上usleep ()暂停一点点时间比较好

三、不要编需要锁的线程应用 只 有那些不需要互斥量的程序才能最大限度的利用线程编程带来的好处,否则只会更慢,2.6内核是抢占式内核,线程间共享冲突发生的几率远比2.4内核环境 高,尤其要注意线程安全,否则就算是单CPU也会发生莫名其妙的内存不同步(CPU的高速缓存和主存内容不一致),Intel的新CPU为了性能使用 NUMA架构,在线程编程中一定要注意扬长避短。

四、单进程服务器最大并发线程数与内存 很有趣,在默认的ulimit参数下,不修改内核头文件 AS3 512M内存最多1000并发持续连接 CentOS4.3 512M内存最多300并发持续连接 似 乎是CentOS不如AS3,这里主要原因是ulimit的配置造成,两个系统默认的配置差距很大,要想单进程维持更多线程接收并发连接,就要尽量缩小 ulimit -s的参数,插更多的内存条,单进程服务器上2000并发一点都不难,POSIX默认的限制是每进程64线程,但NTPL并非纯正POSIX,不必理会这 个限制,2.6内核下真正的限制是内存条的插槽数目(也许还有买内存的钱数)

最 近几天的编程中,注意到在32位x86平台上2.6内核单进程创建最大线程数=VIRT上限/stack,与总内存数关系不大,32位x86系统默认的 VIRT上限是3G(内存分配的3G+1G方式),默认 stack大小是10240K,因此单进程创建线程默认上限也就300(3072M / 10240K),用ulimit -s 修改stack到1024K则使上限升到大约3050。我手头没有64位系统,不知道2.6内核在64位上单进程创建线程上限(实际上是本人懒得在同事的 机器上装fc4_x86_64)。

前些天买了一套廉价的64位x86系统(64位赛杨+杂牌915主板),安装了CentOS4.3的x86_64版本,跑了一遍下面的小程序,得到的结果是:在ulimit -s 4096的情况下,单进程最大线程数在16000多一点,用top看 VIRT 的上限是64G,也就是36位, cat /proc/cpuinfo的结果是:address sizes : 36 bits physical, 48 bits virtual, 和我想象的标准64位系统不同, 我一直以为64位系统的内存空间也是64位的 附注1: 单 位里某BSD FANS用AMD64笔记本跑小程序测试线程创建速度(线程创建后立即phread_detach()然后紧跟着pthread_exit(),共计 100万个线程),同样源码OpenBSD竟然比FreeBSD快了3倍,什么时候OpenBSD也变得疯狂起来了?

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120765.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数
  参加Unix/Linux相关高级研发职位时,是否经常会被文档,单机允许最大进程数、线程数和Socket连接数,而你却感到束手无措呢?本文给你一个最为详细的答案。
数据饕餮
2019/01/14
1.8K0
说来惭愧,我被ulimit摔了一跤...
自接触 linux 后,大家所受的教育就是 ulimit是最便捷的内核优化途径,事实也确实如此。
运维部落
2020/08/28
1.2K0
说来惭愧,我被ulimit摔了一跤...
查看修改Linux最大进程数和最大文件数的方法
执行命令:ulimit -a即可查看当前Linux操作系统的最大进程数、最大文件数 示例:
用户1685462
2021/08/27
6.1K0
/etc/security/limits.conf的相关说明
通过ulimit -n命令可以查看Linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值。那么应该在哪里设置呢?
拓荒者
2019/03/11
2.4K0
使用ulimit 命令、/etc/security/limits.conf、proc 调整系统参数
Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量 系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制. /proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量 linux 中数据的含义 /proc/sys/fs/file-nr [root@localhost logs]# cat /proc/sys/fs/fi
sunsky
2020/08/20
2.1K0
SSH远程连接问题(-bash: fork: retry: Resource temporarily unavailable.)
Linux进程数超过了设置的最大进程数。会对系统进行资源限制,所以分配给ssh进程的资源时有时无,一些命令的bash进程会被杀调,以保证系统进程不超过设置的最大进程数,无法正常执行。即下面的第一个输出要远远小与第二个和第三个输出。如果有些接近就会出现这种问题
山河已无恙
2023/01/30
1.2K0
SSH远程连接问题(-bash: fork: retry: Resource temporarily unavailable.)
centos7中systemctl系统服务和资源限制故障
我们的服务器中使用了很多启动脚本为shell脚本,为了方便管理改为systemctl方式管理。 早上重启后正常,但是晚上流量高峰期间,大量用户无法链接服务器。 查看服务器进程日志出现大量报警日志。 后经过大佬排查。发现是因为systemctl启动的进程没有遵循limits资源限制,导致到达systemctl默认限定值后无法加载更多文件!
开心分享
2020/08/05
4600
初识协程栈
今天开始《Go语言轻松进阶》系列第二章「内存与垃圾回收」第3小节「Go语言垃圾回收原理」。
用户1093396
2023/09/01
2160
初识协程栈
报错 解决-bash: fork: retry: Resource temporarily unavailable
在curl 一个 spring boot 应用接口的时候,出现这个情况,看着启动ok,但是出现如下提示
MickyInvQ
2020/09/27
3.5K0
报错 解决-bash: fork: retry: Resource temporarily unavailable
Linux Core Dump 解析
Core Dump 也称之为“核心转储”, 若当前操作系统开启了 core dump ,当程序运行过程中发生异常或接收到某些信号使得程序进程异常退出时, 由操作系统把程序当前的内存状况以及相关的进程状态信息存储在一个 Core 文件中, 即 Core Dump 。通常,Linux 中如果内存越界会收到 SIGSEGV 信号,然后就会进行 Core Dump 相关操作。
Luga Lee
2021/12/09
3.9K0
经典故障分析报告之-内核参数导致k8s节点故障
1、首先从 Kubernetes 事件中心告警信息如下,该告警集群常规告警事件(其实从下面这些常规告警信息是无法判断是什么故障问题)
IT运维技术圈
2023/02/02
1.2K0
Linux命令(72)—— ulimit 命令(builtin)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
恋喵大鲤鱼
2019/09/18
1K0
limit资源限制ulimit 详解
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 Linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell进程及其子进程的资源使用设置限制。
黄规速
2022/04/15
7.8K0
limit资源限制ulimit 详解
系统配置性能优化测试
描述:它是个ELF可执行文件,该命令将系统配置变量值写入标准输出用于获取系统信息,在进行LINUX编程中可以提供其帮忙;
全栈工程师修炼指南
2022/09/28
2.5K0
系统配置性能优化测试
Linux的一些知识
:wq 强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
sparkle123
2021/03/07
5140
linux 系统 ulimit 对系统资源限制
文件系统及程序的限制关系: ulimit ulimit 限制用户的某些系统资源 包括可以开启的档案数量 可以使用的 CPU 时间 可以使用的内存总量等。 [root@www ~]# ulimit [-acdfHlmnpsStvw] [size] 选项与参数: -H : hard limit ,严格的设定,必定不能超过这个设定的数值 -S : soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息 -a : 后面不接任何选项与参数,可列出所有的限制额度 -c : 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案就被称为核心档案(core file)。 -f : 此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes -d : 程序可使用的最大断裂内存(segment)容量 -l : 可用于锁定 (lock) 的内存量 -m : 设置可以使用的常驻内存的最大值.单位:kbytes -n : 设置内核可以同时打开的文件描述符的最大值.单位:n -p : 设置管道缓冲区的最大值.单位:kbytes -s : 设置堆栈的最大值.单位:kbytes -v : 设置虚拟内存的最大值.单位:kbytes -t : 可使用的最大 CPU 时间 (单位为秒) -u : 单一用户可以使用的最大程序(process)数量 一般简单设置:ulimit -SHn 65535 让其永久生效: [root@www ~]# vi /etc/security/limits.conf * soft noproc 65535 * hard noproc 65535 * soft nofile 409600 * hard nofile 409600 * 代表针对所有用户 noproc 是代表最大进程数 nofile 是代表最大文件打开数 生产环境的案例: [root@www ~]# vi /etc/security/limits.conf # End of file * soft core unlimit * hard core unlimit * soft fsize unlimited * hard fsize unlimited * soft data unlimited * hard data unlimited * soft nproc 65535 * hard nproc 63535 * soft stack unlimited * hard stack unlimited * soft nofile 409600 * hard nofile 409600
heidsoft
2018/10/16
2.7K0
Linux下各种连接数配置
使 /etc/sysctl.conf 的配置生效,根据实际情况来决定是否添加此命令
码客说
2021/11/24
3K0
通过ulimit改善linux系统性能(摘自IBM)[通俗易懂]
本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 用法。通过这篇文章,读者不仅能够了解 ulimit 所起的作用。而且能够学会怎样更好地通过 ulimit 限制资源的使用来改善系统性能。
全栈程序员站长
2022/07/10
3.4K0
大数据项目之_15_帮助文档_优化技巧汇总
  建议每小时或者每天备份,如果数据极其重要,可以5~10分钟备份一次。备份可以通过定时任务复制元数据目录即可。
黑泽君
2019/03/20
6260
大数据项目之_15_帮助文档_优化技巧汇总
Linux查看系统线程数
六月的雨在Tencent
2024/09/07
8170
相关推荐
知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档