Kami memperbaiki kesalahan Terlalu banyak file terbuka di Linux

Sangat sering kesalahan dapat terjadi ketika bekerja di server Linux yang sarat muatan “terlalu banyak file yang terbukas ". Ini berarti bahwa program telah membuka terlalu banyak file (baca deskriptor file) dan tidak dapat membuka yang baru. Di Linux, batasan" max open file limit "ditetapkan secara default untuk setiap proses dan pengguna, dan mereka tidak terlalu tinggi.

Pada artikel ini kita akan melihat cara memeriksa pembatasan saat ini pada jumlah file yang terbuka, bagaimana mengubah pengaturan ini untuk seluruh server, untuk layanan individual dan untuk sesi.

Konten:

  • Kesalahan: Terlalu banyak membuka file dan membatasi jumlah file yang terbuka di Linux
  • Batasi pengaturan untuk batas jumlah file yang dibuka secara bersamaan di Linux
  • Meningkatkan batas deskriptor file terbuka untuk satu layanan
  • Meningkatkan jumlah maksimum file terbuka untuk Nginx dan Apache
  • Batas maksimum file untuk sesi saat ini

Kesalahan: Terlalu banyak membuka file dan membatasi jumlah file yang terbuka di Linux

Pertama, mari kita cari tahu di mana kita bisa mengamati kesalahan "terlalu banyak file terbuka". Paling sering kesalahan ini terjadi pada server dengan server web NGINX / httpd yang diinstal, server database (MySQL / MariaDB / PostgreSQL), ketika membaca sejumlah besar log. Misalnya, ketika server web Nginx tidak memiliki batas yang cukup untuk membuka file, Anda akan menerima kesalahan:

socket () gagal (24: Terlalu banyak file yang terbuka) saat terhubung ke hulu

Jumlah maksimum deskriptor file yang dapat dibuka di sistem Anda dapat ditemukan sebagai berikut:

# cat / proc / sys / fs / file-max

Batas jumlah file terbuka untuk pengguna saat ini adalah 1024. Anda dapat memeriksa ini:

# ulimit -n

Ada dua jenis batasan: Sulit dan Lembut. Pengguna dapat mengubah batas untuk batas lunak (tetapi nilai lunak tidak dapat melebihi hard). Pembatasan keras hanya dapat diubah sebagai pengguna istimewa.

Untuk menampilkan Soft-restriction, jalankan:

# ulimit -NS

Untuk menghasilkan batasan Hard:

# ulimit -nH

Batasi pengaturan untuk batas jumlah file yang dibuka secara bersamaan di Linux

Untuk memungkinkan semua layanan membuka lebih banyak file, Anda dapat mengubah batas di level keseluruhan OS Linux. Agar pengaturan baru berfungsi terus-menerus dan tidak disetel ulang ketika server atau sesi dimulai ulang, file /etc/security/limits.conf harus diperbaiki. Tambahkan baris:

* hard nofile 97816 * soft nofile 97816

Jika Anda menggunakan Ubuntu, Anda perlu menulis baris:

sesi diperlukan pam_limits.so

Parameter ini menambahkan kemampuan untuk memuat batasan selama otorisasi pengguna..

Setelah perubahan, restart terminal dan periksa nilai batas max_open_files:

[root @ server ~] # ulimit -n

97816

Meningkatkan batas deskriptor file terbuka untuk satu layanan

Anda dapat mengubah batas jumlah deskriptor file terbuka untuk layanan tertentu, dan bukan untuk keseluruhan sistem. Pertimbangkan apache sebagai contoh. Untuk mengubah nilai, buka pengaturan layanan melalui systemctl: # systemctl edit httpd.service Tambahkan batas yang diperlukan, misalnya:

[Layanan] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Setelah perubahan, Anda perlu memperbarui konfigurasi layanan dan memulai kembali:

# systemctl daemon-reload
# systemctl restart httpd.service

Untuk memeriksa apakah nilainya telah berubah, Anda perlu mendapatkan PID layanan:

# systemctl status httpd.service

Misalnya, Anda menetapkan layanan PID 32724:

# cat / proc / 32724 / limit | grep "Maks membuka file”

Jadi, Anda mengubah nilai file terbuka Max untuk layanan tertentu.

Meningkatkan jumlah maksimum file terbuka untuk Nginx dan Apache

Jika Anda mengubah batas jumlah file terbuka untuk server web, Anda juga harus memperbaiki file konfigurasi layanan. Misalnya, untuk Nginx dalam file konfigurasi /etc/nginx/nginx.conf, perlu mendaftar / mengubah nilai dalam arahan:

worker_rlimit_nofile 16000
Ketika mengkonfigurasi Nginx pada server 8-core yang penuh muatan dengan worker_connections 8192, tentukan 8192 * 2 * 8 (vCPU) = 131072 di worker_rlimit_nofile.

Kemudian restart Nginx.

Untuk apache, Anda perlu membuat direktori:

# mkdir /lib/systemd/system/httpd.service.d/

Setelah itu, buat file limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

Dan tambahkan ke dalamnya:

[Layanan] LimitNOFILE = 16000

Ingatlah untuk memulai kembali layanan httpd.

Batas maksimum file untuk sesi saat ini

Untuk mengubah batas file terbuka dalam sesi terminal Anda, jalankan perintah:

# ulimit -n 3000

Saat menutup terminal dan membuat sesi baru, batas kembali ke nilai awal yang ditentukan dalam file /etc/security/limits.conf.

Untuk mengubah nilai keseluruhan dalam sistem / proc / sys / fs / file-max, ubah nilai fs.file-max di /etc/sysctl.conf:

fs.file-max = 100000

Dan terapkan:

# sysctl -p

Pada artikel ini, kami menemukan cara untuk menyelesaikan masalah dengan batas yang tidak cukup untuk deskriptor file terbuka di Linux dan memeriksa beberapa opsi untuk mengubah batas server.