Cara Mengatasi Kesalahan "Terlalu Banyak File Terbuka" di Linux

Diterbitkan: 2022-06-29
Laptop Linux menampilkan prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Pada komputer Linux, sumber daya sistem dibagi di antara pengguna. Cobalah untuk menggunakan lebih dari bagian wajar Anda dan Anda akan mencapai batas atas. Anda mungkin juga menghambat pengguna atau proses lain.

Sumber Daya Sistem Bersama

Di antara trilyun pekerjaan lainnya, kernel komputer Linux selalu sibuk mengawasi siapa yang menggunakan berapa banyak sumber daya sistem yang terbatas, seperti siklus RAM dan CPU. Sistem multi-pengguna membutuhkan perhatian terus-menerus untuk memastikan orang dan proses tidak menggunakan lebih banyak sumber daya sistem yang diberikan daripada yang sesuai.

Tidak adil, misalnya, bagi seseorang untuk menghabiskan begitu banyak waktu CPU sehingga komputer terasa lambat untuk orang lain. Bahkan jika Anda adalah satu-satunya orang yang menggunakan komputer Linux Anda, ada batasan yang ditetapkan untuk sumber daya yang dapat digunakan oleh proses Anda. Lagi pula, Anda masih pengguna lain.

Apa itu RAM? Semua yang Perlu Anda Ketahui
TERKAIT Apa itu RAM? Semua yang Perlu Anda Ketahui

Beberapa sumber daya sistem terkenal dan jelas, seperti RAM, siklus CPU, dan ruang hard drive. Tetapi ada banyak, lebih banyak lagi sumber daya yang dipantau dan yang setiap pengguna—atau setiap proses yang dimiliki pengguna—memiliki batas atas yang ditetapkan. Salah satunya adalah jumlah file yang dapat dibuka oleh suatu proses sekaligus.

Jika Anda pernah melihat pesan kesalahan "Terlalu banyak file yang dibuka" di jendela terminal atau menemukannya di log sistem Anda, itu berarti batas atas telah tercapai, dan proses tidak diizinkan untuk membuka file lagi.

Bukan Hanya File yang Anda Buka

Ada batasan seluruh sistem untuk jumlah file terbuka yang dapat ditangani oleh Linux. Ini jumlah yang sangat besar, seperti yang akan kita lihat, tetapi masih ada batasnya. Setiap proses pengguna memiliki alokasi yang dapat mereka gunakan. Mereka masing-masing mendapatkan bagian kecil dari total sistem yang dialokasikan untuk mereka.

Apa yang sebenarnya dialokasikan adalah sejumlah pegangan file . Setiap file yang dibuka membutuhkan pegangan. Bahkan dengan alokasi yang cukup besar, pegangan file di seluruh sistem dapat digunakan lebih cepat dari yang Anda bayangkan.

Apa Arti "Semuanya Adalah File" di Linux?
TERKAIT Apa Arti "Semuanya Adalah File" di Linux?

Linux mengabstraksi hampir semuanya sehingga tampak seolah-olah itu adalah file. Terkadang mereka hanya itu, file lama biasa. Tetapi tindakan lain seperti membuka direktori juga menggunakan pegangan file. Linux menggunakan blok file khusus sebagai semacam driver untuk perangkat keras. File khusus karakter sangat mirip, tetapi lebih sering digunakan dengan perangkat yang memiliki konsep throughput, seperti pipa dan port serial.

Blok file khusus menangani blok data pada satu waktu dan file khusus karakter menangani setiap karakter secara terpisah. Kedua file khusus ini hanya dapat diakses dengan menggunakan pegangan file. Pustaka yang digunakan oleh program menggunakan pegangan file, aliran menggunakan pegangan file, dan koneksi jaringan menggunakan pegangan file.

Mengabstraksi semua persyaratan yang berbeda ini sehingga muncul sebagai file menyederhanakan antarmuka dengannya dan memungkinkan hal-hal seperti pemipaan dan aliran berfungsi.

Anda dapat melihat bahwa di balik layar Linux membuka file dan menggunakan pegangan file hanya untuk menjalankannya sendiri—tidak peduli proses pengguna Anda. Jumlah file yang terbuka bukan hanya jumlah file yang Anda buka. Hampir semua yang ada di sistem operasi menggunakan pegangan file.

Batas Penanganan File

Jumlah maksimum pegangan file di seluruh sistem dapat dilihat dengan perintah ini.

 cat /proc/sys/fs/file-max 

Menemukan sistem maksimum untuk file yang terbuka

Ini mengembalikan sejumlah besar 9,2 triliun. Itulah sistem teoritis maksimum. Ini adalah nilai terbesar yang dapat Anda pegang dalam bilangan bulat bertanda 64-bit. Apakah komputer Anda yang buruk benar-benar dapat mengatasi banyak file yang terbuka sekaligus adalah masalah lain sama sekali.

Di tingkat pengguna, tidak ada nilai eksplisit untuk jumlah maksimum file terbuka yang dapat Anda miliki. Tapi kita bisa menyelesaikannya secara kasar. Untuk mengetahui jumlah maksimum file yang dapat dibuka oleh salah satu proses Anda, kita dapat menggunakan perintah ulimit dengan opsi -n (membuka file).

 ulimit -n 

Menemukan berapa banyak file yang dapat dibuka oleh suatu proses

Dan untuk menemukan jumlah proses maksimum yang dapat dimiliki pengguna, kami akan menggunakan ulimit dengan opsi -u (proses pengguna).

 ulimit -u 

Menemukan jumlah proses yang dapat dimiliki pengguna

Mengalikan 1024 dan 7640 menghasilkan 7.823.360. Tentu saja, banyak dari proses tersebut akan sudah digunakan oleh lingkungan desktop Anda dan proses latar belakang lainnya. Jadi itu adalah maksimum teoretis lainnya, dan yang tidak akan pernah Anda capai secara realistis.

Angka penting adalah jumlah file yang dapat dibuka oleh suatu proses. Secara default, ini adalah 1024. Perlu dicatat bahwa membuka file yang sama 1024 kali secara bersamaan sama dengan membuka 1024 file berbeda secara bersamaan. Setelah Anda menggunakan semua pegangan file, Anda selesai.

Dimungkinkan untuk menyesuaikan jumlah file yang dapat dibuka oleh suatu proses. Sebenarnya ada dua nilai yang perlu dipertimbangkan saat Anda menyesuaikan angka ini. Salah satunya adalah nilai yang saat ini disetel, atau yang Anda coba atur. Ini disebut batas lunak . Ada batas keras juga, dan ini adalah nilai tertinggi yang dapat Anda naikkan batas lunaknya.

Cara berpikir tentang ini adalah batas lunak sebenarnya adalah "nilai saat ini" dan batas atas adalah nilai tertinggi yang dapat dicapai oleh nilai saat ini. Pengguna biasa, non-root, dapat menaikkan batas lunaknya ke nilai apa pun hingga batas kerasnya. Pengguna root dapat meningkatkan batas keras mereka.

Untuk melihat batas lunak dan keras saat ini, gunakan ulimit dengan opsi -S (lunak) dan -H (keras), dan opsi -n (buka file).

 ulimit -Sn
 ulimit -Hn 

Menemukan batas lunak dan keras untuk menangani file proses

Untuk menciptakan situasi di mana kita dapat melihat batas lunak diberlakukan, kita membuat program yang berulang kali membuka file hingga gagal. Kemudian menunggu penekanan tombol sebelum melepaskan semua pegangan file yang digunakannya. Program ini disebut open-files .

 ./buka-File 

Program file terbuka mencapai batas lunak 1024

Ini membuka 1021 file dan gagal saat mencoba membuka file 1022.

1024 dikurangi 1021 adalah 3. Apa yang terjadi dengan tiga pegangan file lainnya? Mereka digunakan untuk aliran STDIN , STDOUT , dan STDERR . Mereka dibuat secara otomatis untuk setiap proses. Ini selalu memiliki nilai deskriptor file 0, 1, dan 2.

TERKAIT: Cara Menggunakan Perintah lsof Linux

Kita dapat melihatnya menggunakan perintah lsof dengan opsi -p (proses) dan ID proses dari program open-files . Dengan mudah, ia mencetak ID prosesnya ke jendela terminal.

 lsof -p 11038 

Aliran stdin, stdout, dan stderr dan menangani file di output perintah lsof

Tentu saja, Dalam situasi dunia nyata, Anda mungkin tidak tahu proses mana yang baru saja melahap semua pegangan file. Untuk memulai penyelidikan Anda, Anda bisa menggunakan urutan perintah pipa ini. Ini akan memberi tahu Anda lima belas pengguna paling produktif menangani file di komputer Anda.

 lsof | awk '{ print $1 " " $2; }' | urutkan -rn | uniq -c | urutkan -rn | kepala -15 

Melihat proses yang menggunakan paling banyak pegangan file

Untuk melihat lebih banyak atau lebih sedikit entri, sesuaikan parameter -15 ke perintah head . Setelah Anda mengidentifikasi prosesnya, Anda perlu mencari tahu apakah prosesnya telah menjadi jahat dan membuka terlalu banyak file karena di luar kendali, atau apakah itu benar-benar membutuhkan file tersebut. Jika memang membutuhkannya, Anda perlu meningkatkan batas penanganan filenya.

Meningkatkan Batas Lunak

Jika kita meningkatkan batas lunak dan menjalankan program kita lagi, kita akan melihatnya membuka lebih banyak file. Kami akan menggunakan perintah ulimit dan opsi -n (membuka file) dengan nilai numerik 2048. Ini akan menjadi batas lunak baru.

 batas -n 2048 

Menyetel batas lunak penanganan file baru untuk proses

Kali ini kita berhasil membuka 2045 file. Seperti yang diharapkan, ini adalah tiga kurang dari 2048, karena pegangan file yang digunakan untuk STDIN , STDOUT , dan STDERR .

Membuat Perubahan Permanen

Meningkatkan batas lunak hanya memengaruhi shell saat ini. Buka jendela terminal baru dan periksa batas lunak. Anda akan melihatnya sebagai nilai default lama. Tetapi ada cara untuk secara global menetapkan nilai default baru untuk jumlah maksimum file terbuka yang dapat dimiliki suatu proses yang persisten dan bertahan dari reboot.

Saran yang ketinggalan zaman sering merekomendasikan Anda untuk mengedit file seperti "/etc/sysctl.conf" dan "/etc/security/limits.conf." Namun, pada distribusi berbasis systemd, pengeditan ini tidak bekerja secara konsisten, terutama untuk sesi masuk grafis.

Teknik yang ditunjukkan di sini adalah cara untuk melakukan ini pada distribusi berbasis systemd. Ada dua file yang perlu kita kerjakan. Yang pertama adalah file “/etc/systemd/system.conf”. Kita harus menggunakan sudo .

 sudo gedit /etc/systemd/system.conf 

Mengedit file system.conf

Cari baris yang berisi string “DefaultLimitNOFILE.” Hapus hash "#" dari awal baris, dan edit nomor pertama ke apa pun yang Anda inginkan batas lunak baru untuk proses. Kami memilih 4096. Angka kedua pada baris itu adalah batas keras. Kami tidak menyesuaikan ini.

Nilai DefaultLimitNOFILE dalam file system.conf

Simpan file dan tutup editor.

Kita perlu mengulangi operasi itu pada file “/etc/systemd/user.conf”.

 sudo gedit /etc/systemd/user.conf 

Mengedit file user.conf

Buat penyesuaian yang sama pada baris yang berisi string “DefaultLimitNOFILE.”

Nilai DefaultLimitNOFILE di file user.conf

Simpan file dan tutup editor. Anda harus me-reboot komputer Anda atau menggunakan perintah systemctl dengan opsi daemon-reexec sehingga systemd dijalankan kembali dan menyerap pengaturan baru.

 sudo systemctl daemon-reexec 

Mulai ulang sistemd

Membuka jendela terminal dan memeriksa batas baru akan menunjukkan nilai baru yang Anda tetapkan. Dalam kasus kami itu adalah 4096.

 ulimit -n 

Memeriksa batas lunak baru dengan ulimit -n

Kami dapat menguji ini adalah nilai operasional langsung dengan menjalankan kembali program rakus file kami.

 ./buka-File 

Memeriksa batas lunak baru dengan program file terbuka

Program gagal membuka nomor file 4094, artinya 4093 adalah file yang dibuka. Itulah nilai yang kami harapkan, 3 kurang dari 4096.

Semuanya adalah File

Itu sebabnya Linux sangat bergantung pada pegangan file. Nah, kalau udah mulai kehabisan, tau caranya nambah kuota.

TERKAIT: Apa itu stdin, stdout, dan stderr di Linux?