Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中每个进程的最大线程数?_Linux_Multithreading - Fatal编程技术网

Linux中每个进程的最大线程数?

Linux中每个进程的最大线程数?,linux,multithreading,Linux,Multithreading,Linux下进程可以创建的最大线程数是多少 如何(如果可能)修改此值?检索此值: cat /proc/sys/kernel/threads-max 要设置它,请执行以下操作: echo 123456789 | sudo tee -a /proc/sys/kernel/threads-max 123456789=#of threadsLinux没有单独的每个进程的线程限制,只有系统上进程总数的限制(线程基本上只是Linux上具有共享地址空间的进程),您可以这样查看: cat /proc/sys

Linux下进程可以创建的最大线程数是多少

如何(如果可能)修改此值?

检索此值:

cat /proc/sys/kernel/threads-max
要设置它,请执行以下操作:

echo 123456789 | sudo tee -a /proc/sys/kernel/threads-max

123456789=#of threads

Linux没有单独的每个进程的线程限制,只有系统上进程总数的限制(线程基本上只是Linux上具有共享地址空间的进程),您可以这样查看:

cat /proc/sys/kernel/threads-max
默认值为内存页数/4。您可以这样增加:

echo 100000 > /proc/sys/kernel/threads-max

单个用户可以创建的进程(以及线程)数量也有限制,有关这些限制的详细信息,请参见
ulimit/getrlimit

实际上,限制通常由堆栈空间决定。如果每个线程都有一个1MB堆栈(我不记得这是否是Linux上的默认值),那么在3000个线程之后,32位系统的地址空间就会用完(假设最后一个gb保留给内核)

但是,如果您使用的线程超过几十个,您很可能会体验到糟糕的性能。迟早会有太多的上下文切换开销,调度器中的开销,等等。(创建大量线程只会消耗大量内存。但是,大量有实际工作要做的线程会降低您的速度,因为它们正在争夺可用的CPU时间)


如果这个限制是相关的,你在做什么?

这可能不重要。如果将算法设计为使用固定数量的线程(例如,如果有4个或8个处理器,则为4个或8个),您将获得更好的性能。您可以使用工作队列、异步IO或类似libevent的东西来实现这一点

使用
nbio
非阻塞i/o
如果需要更多线程来执行阻塞的I/O调用,那么说LINUX没有每个进程单独的线程限制是错误的

Linux间接实现每个进程的最大线程数

因此,可以通过增加总虚拟内存或减少堆栈大小来增加每个进程的线程数。但是,当最大虚拟内存等于交换内存时,由于堆栈溢出,过度减小堆栈大小可能导致代码失败

检查您的机器:

ulimit -s newvalue

ulimit -v newvalue
总虚拟内存:
ulimit-v
(默认值是无限的,因此需要增加交换内存以增加该值)

总堆栈大小:
ulimit-s
(默认值为8Mb)

增加这些值的命令:

ulimit -s newvalue

ulimit -v newvalue
*将新值替换为要设置为限制的值

参考文献:

ulimit -s newvalue

ulimit -v newvalue

根据您的系统,只需编写一个示例程序[通过在循环中创建进程]并使用ps-axo-pid、ppid、rss、vsz、nlwp、cmd进行检查。当它不能再创建线程时,检查nlwp计数[nlwp是线程数]瞧,你得到了你的傻瓜式答案,而不是阅读书籍

Linux不使用虚拟内存来计算线程的最大值,而是使用安装在系统上的物理ram

 max_threads = totalram_pages / (8 * 8192 / 4096);

kernel/fork.c

/* The default maximum number of threads is set to a safe
 * value: the thread structures can take up at most half
 * of memory.
 */
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
因此,每个系统的线程最大值都不同,因为安装的ram大小不同,我知道Linux不需要增加虚拟内存,因为在32位上,我们有3 GB的用户空间,1 GB的内核空间,在64位上,我们有128 TB的虚拟内存,这在Solaris上发生,如果要增加虚拟内存,则需要添加交换空间。

线程计数限制:

$ cat /proc/sys/kernel/threads-max 
计算方法:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
以及: x86_64页面大小(页面大小)为4K; 与所有其他体系结构一样,x86_64对每个活动线程都有一个内核堆栈。这些线程堆栈是线程大小(2*页面大小)大

对于mempages:

cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
因此,实际上这个数字与线程内存堆栈大小的限制无关(
ulimit-s


注意:在我的rhel虚拟机中,线程内存堆栈限制为10M,对于1.5G内存,该虚拟机只能提供150个线程?

linux上适当的100k线程:

ulimit -s  256
ulimit -i  120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max 

 ./100k-pthread-create-app
2018年更新自@Thomas,关于systemd systems:

/etc/systemd/logind.conf: UserTasksMax=100000

我们可以在linux中看到以下文件中定义的最大线程数

cat/proc/sys/kernel/threads max

(或)

sysctl-a | grep threads max

永久设置

vim /etc/sysctl.conf
并添加

kernel.threads-max = "value"

对于现在看到这一点的人来说,在systemd系统(在我的例子中,特别是Ubuntu 16.04)上,cgroup pids.max参数还有一个限制

默认设置为12288,可以在/etc/systemd/logind.conf中重写


其他建议仍然适用,包括PID_max、threads max、max_maps_count、ulimit等。

使用ulimit检查每个线程的堆栈大小,在我的例子中是Redhat Linux 2.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240
每个线程都将获得分配给其堆栈的内存量(10MB)。对于32位程序和4GB的最大地址空间,最大值仅为4096MB/10MB=409个线程!!!减去程序代码,减去堆空间可能会导致观察到最多300个线程


您应该能够通过编译并在64位上运行或设置ulimit-s8192甚至ulimit-s4096来提高这一点。但如果这是另一个讨论…

您可以通过以下命令查看当前值- cat/proc/sys/kernel/threads max

您还可以设置如下值

echo 100500>/proc/sys/kernel/threads max


您设置的值将根据可用RAM页面进行检查。如果线程结构占用可用RAM页面的1/8)以上,则线程最大值将相应减少。

是,要增加线程数,需要增加虚拟内存或减小堆栈大小。在Raspberry Pi中,我没有找到增加虚拟内存的方法,如果将堆栈大小从默认的8MB减少到1MB,则每个进程可能会获得1000多个线程,但是
java/jstack/jstat ...
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /root/hs_err_pid1390.log
root@lascorehadoop-15a32:~# free -mh
              total        used        free      shared  buff/cache   available
Mem:           125G         11G         41G        1.2G         72G        111G
Swap:            0B          0B          0B
~# ps -eLf|wc -l
31506
root@myhost:~# 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) 515471
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 98000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 515471
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited