$ sysctl -a | grep kernel.pid_max kernel.pid_max = 32768 # 输出结果表示当前系统容许的最大进程数为32768 $ cat /proc/sys/kernel/pid_max # 命令功用与上述一样 $ echo 200000 > /proc/sys/kernel/pid_max # 修改系统级最大进程数为200000,可经过sysctl查看修改
# /proc/sys/kernel/threads-max 限制了系统级最大线程数 $ echo 120000 > /proc/sys/kernel/threads-max # 修改系统级最大线程数为120000,可经过sysctl查看修改 # Linux没有每一个进程单独的最大线程数限制
$ 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) 515005 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 4096 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) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited # 经过ulimit -u,可见用户默认的最大进程(含线程)数是1024 # 经过ulimit -s,可见进程默认的最大栈大小是10M $ ulimit -u 32000 # 更改用户默认的最大进程(含线程)数为32000
如何验证 ulimit 中的资源限制?如何查看当前使用量?java
Modify 'Soft Limit' of 'Max processes'linux
number of threads = total virtual memory / (stack size10241024)
从上可知,最大线程数的增长能够经过增长虚拟内存或减小线程栈大小两种手段。
可是,减小线程栈大小可能会致使栈溢出的异常。bash
$ ulimit -v newValue # 更改进程默认的虚拟内存大小 $ ulimit -s newValue # 更改进程默认的栈大小
max_map_count文件包含限制一个进程能够拥有的VMA(虚拟内存区域)的数量。默认值是65536。
虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,连接到共享内存段,或者分配堆空间的时候,这些区域将被建立。
调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能致使应用程序出错,由于当进程达到了VMA上限但又只能释放少许的内存给其余的内核进程使用时,操做系统会抛出内存不足的错误。
若是你的操做系统在NORMAL区域仅占用少许的内存,那么调低这个值能够帮助释放内存给内核用。
因值太低抛错在JVM中可能会呈现Java.lang.OutOfMemoryError: Map failed。详情参见max_map_count超出致使的OOMjvm
$ echo 'vm.max_map_count=655360' >> /etc/sysctl.conf # rocketmq系统参数配置了默认值的10倍 $ echo 600000 > /proc/sys/vm/max_map_count # 更改VMA映射数量为600000,可经过sysctl查看修改
线程本质上是进程,显著区别在于线程运行在共享内存空间,而进程运行在独立内存空间
/proc/sys/kernel/pid_max 决定的进程数是运行于独立内存空间的进程
/proc/sys/kernel/threads-max 决定的线程数是运行于共享内存空间的线程
ulimit -u 指的是一个用户在同一时间最多能拥有的总进程(含线程)spa
ulimit 的进程数(含线程)受限于 pid_max 及 threads-max操作系统
参考资料:
Understanding the difference between pid_max, ulimit -u and thread_max.net
Maximum number of threads per process in Linux?线程
$ cat /proc/loadavg 0.41 0.45 0.57 3/749 28174 # 输出结果第四列含有被“/”分割的两个数字。 # 第一个数字表示当前可执行的内核调度实体(进程、线程)数量,一般小于或等于Cpu的数量。 # 第二个数字表示当前存在的内核调度实体,如上例当前并行存在749个线程 $ ps -elf | wc -l 220 # 当前进程数220(实际上减一行应为219),不包含进程建立的线程 $ ps -elfT | wc -l 385 # 当前线程数385(实际上减一行应为384),包含全部进程及线程 $ ps -p PID -lfT | wc -l # 指定PID查看线程数,该线程数应该与Jstack生成的Thread Dump上的线程数一致 $ jstack -l PID | grep tid | wc -l # jstack位于Jdk安装目录bin下,用于输出线程快照
bash $ java -XX:+PrintFlagsFinal -version | grep ThreadStackSize intx ThreadStackSize = 1024 # 输出结果表示JVM默认线程栈大小为1M
bash JAVA_OPTS="-Xms128m -Xmx1303m -Xss256k" # 上述JVM参数表示JVM最小内存大小为128M,最大内存大小为1303M,线程栈大小为256K