GNU/Linux >> Belajar Linux >  >> Linux

Cara meningkatkan jumlah maksimum utas JVM (Linux 64bit)

Anda dapat menggunakan contoh program untuk mengetahui batas utas saat ini.

Jika Anda menemukan Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread , periksa ini:

  1. Di mesin memori kecil

    Setiap utas Java menggunakan memori tumpukannya sendiri. Ukuran tumpukan default adalah 1024k (=1M). Anda dapat mengurangi ukuran stack seperti java -Xss512k ... . JVM tidak dapat dijalankan jika ukuran tumpukan terlalu rendah.

    Dan berhati-hatilah dengan konfigurasi memori heap:(awal) -Xms dan (maksimum) -Xmx . Semakin banyak memori yang dialokasikan ke heap, semakin sedikit memori yang tersedia untuk stack.

  2. Batasan sistem

    Beberapa nilai di ulimit -a dapat memengaruhi batas utas.

    • max memory size - tidak terbatas pada sebagian besar mesin 64bit
    • max user processes - linux memperlakukan utas seperti proses
    • virtual memory - tidak terbatas pada kebanyakan mesin 64bit. penggunaan memori virtual ditingkatkan dengan konfigurasi -Xss (default 1024k)

    Anda dapat mengubah nilai ini dengan (sementara) menjalankan ulimit perintah atau pengeditan (permanen) /etc/security/limits.conf .

  3. sys.kernel.threads-max

    Nilai ini adalah jumlah utas maksimum sistem-global (termasuk proses non-JVM). Periksa cat /proc/sys/kernel/threads-max , dan tingkatkan jika perlu.

    echo 999999 > /proc/sys/kernel/threads-max
    atau
    sys.kernel.threads-max = 999999 di /etc/sysctl.conf untuk berubah secara permanen.

  4. sys.kernel.pid_max

    Jika cat /proc/sys/kernel/pid_max mirip dengan batas saat ini, tingkatkan ini. Linux memperlakukan utas seperti proses.

    echo 999999 > /proc/sys/kernel/pid_max
    atau
    sys.kernel.pid_max = 999999 di /etc/sysctl.conf untuk berubah secara permanen.

    Dan Anda mungkin perlu meningkatkan sys.vm.max_map_count , juga.

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count minimal harus (2 x jumlah utas).

    Attempt to protect stack guard pages failed. dan OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. pesan kesalahan dikeluarkan oleh JavaThread::create_stack_guard_pages(), dan memanggil os::guard_memory(). Di Linux, fungsi ini adalah mprotect().

    echo 1999999 > /proc/sys/vm/max_map_count
    atau
    sys.vm.max_map_count = 1999999 di /etc/sysctl.conf untuk berubah secara permanen.


Informasi tambahan untuk sistem linux modern (systemd).

Ada banyak sumber tentang nilai-nilai ini yang mungkin perlu diubah (jawaban lainnya adalah sumber yang bagus untuk sebagian besar dari mereka); namun batas baru diberlakukan melalui batas "TasksMax" systemd yang menetapkan pids.max pada cgroup.

Untuk sesi login, default UserTasksMax adalah 33% dari batas kernel pids_max (biasanya 12.288) dan dapat diganti di /etc/systemd/logind.conf.

Untuk layanan, standar DefaultTasksMax adalah 15% dari batas kernel pids_max (biasanya 4.915). Anda dapat menimpanya untuk layanan dengan menyetel TasksMax di "systemctl edit" atau memperbarui DefaultTasksMax di /etc/systemd/system.conf


Saya mengalami masalah serupa dalam program Python dan berikut ini berhasil untuk saya. Ini didasarkan pada jawaban maczniak di atas dan https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max.

echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p

Saya juga harus menyetel DefaultTasksMax di /etc/systemd/system.conf (atau /etc/systemd/user.conf untuk layanan yang dijalankan pengguna) ke DefaultTasksMax=unlimited .

Systemd juga menerapkan batasan untuk program yang dijalankan dari login-shell. Standar ini menjadi 4096 per pengguna (akan ditingkatkan menjadi 12288) dan dikonfigurasi sebagai UserTasksMax di bagian [Login] dari/etc/systemd/logind.conf .

Itu dari pertanyaan StackExchange ini. Menyetel UserTasksMax saya ke UserTasksMax=999999 bekerja untuk saya.


Linux
  1. Bagaimana Cara Meningkatkan Jumlah Inode Dalam Sistem File Ext4?

  2. Linux – Bagaimana Cara Meningkatkan Maxsymlink?

  3. Linux – Bagaimana Cara Membuat Koneksi Ad-hoc?

  1. Linux – Bagaimana Melacak Program Java?

  2. Jumlah maksimum utas per proses di Linux?

  3. Jumlah maksimum file/direktori di Linux?

  1. Cara Menambah Nomor Disk Inode di Linux

  2. Cara Membuat Atau Menambah Ruang Swap Di Linux

  3. Bagaimana cara menonaktifkan konfigurasi otomatis pada IPv6 di Linux?