Я хочу знать: моя система может работать 50000 нет. параллельных потоков/процесса или нет?
Для этого я изменил свой 'ulimit max process' и '/proc/sys/kernel/pid_max' до 50000. Но все же я не могу пересечь ~ 33000 нет. процесса/потоков.
Нет. процесса/потоков в моей системе я использую: ps -eL | wc -l И я написал программу java для создания этих no. потоков.
но в последнее время я получаю это исключение:
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Total thread created #**32515**
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at HowManyThreads.main(HowManyThreads.java:12)
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
^CJava HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
Пожалуйста, помогите мне создать 50000 нет. процесса/потока.
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) 2066250
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 150000
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) 40000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
cat/proc/sys/kernel/pid_max
50000
Java-программа
package create.threads;
public class HowManyThreads
{
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv)
{
try
{
for(;;)
{
new Thread(new Runnable()
{
public void run()
{
synchronized(s)
{
count += 1;
}
for(;;)
{
try
{
Thread.sleep(1000);
} catch (Exception e){
System.out.println(e);
}
}
}
}).start();
}
}
finally
{
System.out.println("Total thread created #"+count);
}
}
}
Это бесплатный вывод команды в моей системе: когда моя программа запускается и выдает ошибку/исключение
free -g
total used free shared buffers cached
Mem: 252 3 248 0 0 0
-/+ buffers/cache: 3 249
Swap: 1 0 1
когда я не запускаю эту программу
free -g
total used free shared buffers cached
Mem: 252 2 250 0 0 0
-/+ buffers/cache: 1 250
Swap: 1 0 1
Не могли бы вы помочь мне... где я чего-то не хватает...
Потоки используют память на куче (сюрприз!)
Вы можете исправить свою проблему, поставив больше кучи в вашу Java-программу:
java -Xmx1024m <whatever comes for your application>
для 1 гигабайта памяти.
Правило большого пальца было 1 мб для потока, поэтому, если вы хотите потоки 50 тыс., Вам нужно 50 гб памяти.
Чтобы уменьшить это, вы можете уменьшить размер стека за поток
java -Xss512k
для 512k стека, для вашего конкретного примера вы можете уйти с 1k или даже меньше. По умолчанию для Linux x64 кажется 256k.
НО я бы предпочел, почему вам нужно столько потоков, чтобы делать что-то. Вы должны использовать threadpool, который соответствует тому, что у вас есть в процессорных ядрах, а затем просто планируйте работу в этом пуле.
Я считаю, что это не количество процессов, а память:
Исключение в потоке "main" java.lang.OutOfMemoryError: невозможно создать новый собственный поток в java.lang.Thread.start0 (Native Method) в java.lang.Thread.start(Thread.java:640) в HowManyThreads.main( HowManyThreads.java:12)
Исключение просто "вне памяти" или нет?
Но есть еще несколько ограничений:
Каждый процесс открывает stdin/stdout/stderror, что означает 3 файла. 50k Threads означает 150K файлов.
Но как вы можете прочитать здесь: Максимальное количество потоков в процессе в Linux?
количество потоков на процесс в основном ограничено размером памяти.
Exception java.lang.OutOfMemoryError
должно дать вам подсказку ...