Сколько потоков / процессов я могу запустить на моей 64-битной машине

1

Я хочу знать: моя система может работать 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

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

  • 1
    Exception java.lang.OutOfMemoryError должно дать вам подсказку ...
  • 0
    пожалуйста, проверьте вывод свободной команды. У меня 252 ГБ памяти :). И моя программа использует только 2 ГБ памяти.
Теги:

2 ответа

1

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

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

java -Xmx1024m <whatever comes for your application>

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

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

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

java -Xss512k

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

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

  • 1
    Вы также можете использовать «-Xss512k» или ниже, чтобы уменьшить размер стека потоков. Это может позволить вам запустить 50000 потоков с «только» 26 ГБ оперативной памяти.
  • 0
    @Tamwind действительно, ему, вероятно, даже не нужно так много стека в потоке, 1k, возможно, уже будет достаточно. Добавил, спасибо за предложение!
Показать ещё 3 комментария
1

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

Исключение в потоке "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?

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

  • 0
    У меня много памяти (252 ГБ). Пожалуйста, проверьте вывод свободной команды. И для нет. из открытых файлов / FD, я установил 150000 в limit.conf. Те другие ограничения, которые я хочу выяснить.
  • 0
    Возможно, проблема в том, что куча потока создается внутри памяти процесса и, таким образом, достигается ограничение памяти процесса. Но у меня нет опыта работы таких больших систем памяти. Может быть, вы посмотрите на эту тему.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню