2014-09-25 2 views
1

Я хочу знать: моя система может работать 50000 нет. параллельных потоков/процесса или нет?Сколько потоков/процессов можно запустить на моей 64-битной машине

Для этого я изменил свой 'ulimit max process' и '/ proc/sys/kernel/pid_max' на 50000. Но все же я не могу пересечь ~ 33000 нет. процесса/потоков.

Отметить нет. процесса/потоков в моей системе я использую: ps -eL | wc -l И я написал программу java для создания тех, нет. потоков.

но в прошлом я получаю это исключение:

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 

кот/Труды/SYS/ядро ​​/ 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 

Не могли бы вы помочь мне ... где я что-то ....

+0

'Исключение java.lang.OutOfMemoryError' должен дать вам ключ ... – isedev

+0

пожалуйста, проверьте свободный вывод команды. У меня 252 ГБ памяти :). И моя программа, использующая только 2 ГБ памяти. – Upendra

ответ

1

Темы использовать память на куче (сюрприз отсутствует!)

Вы можете исправить вашу проблему, предоставляя больше кучи для вашей программы Java:

java -Xmx1024m <whatever comes for your application> 

для 1 гигабайта памяти.

Правило большого пальца было 1mb для потока, поэтому, если вы хотите потоки 50k, вам нужно 50 гб памяти.

Чтобы снизить это, вы можете уменьшить размер стека для каждого потока

java -Xss512k 

для 512k стека, для вашего конкретного примера вы можете уйти с только 1k или даже меньше. The default for Linux x64 seems 256k.

BUT Я бы предпочел задать вопрос, почему вам нужно столько потоков, чтобы делать что-то. Вы должны использовать threadpool, который соответствует тому, что у вас есть в процессорных ядрах, а затем просто планируйте работу в этом пуле.

+1

Вы также можете использовать «-Xss512k» или ниже, чтобы уменьшить размер стека потоков. Он может позволить вам запускать 50000 потоков с «только» 26 ГБ ОЗУ. – archz

+0

@Tamwind действительно, он, вероятно, даже не нуждается в таком большом стеке в потоке, 1k может быть уже достаточно. Добавил его, спасибо за предложение! –

+0

@Tamwind, когда я добрался до Exception, я взял свободный вывод команды, и у него пока еще много памяти. – Upendra

1

Я считаю, что это не количество процессов, но память:

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)

Exeption просто «из памяти» или нет?

Но есть еще некоторые ограничения:

Каждый процесс открывает STDIN/STDOUT/stderror, что означает 3 файлов. 50k Threads означает 150K файлов.

Но как вы можете прочитать здесь: Maximum number of threads per process in Linux?

количество потоков на процесс в основном ограничивается размером памяти.

+0

У меня много памяти (252 ГБ). Проверьте свободный выход команды. И нет. открытых файлов/fd, i установлен в 150000 в limits.conf. Те другие ограничения, которые я хочу выяснить. – Upendra

+0

Может быть, проблема в том, что куча нити создается внутри памяти процесса, и поэтому предел памяти процесса достигается. Но у меня нет опыта в таких больших системах памяти. Может быть, вы ищете эту тему. – Klaus

+0

Спасибо Клаус. Я проверю и обновлю. – Upendra

Смежные вопросы