Jika Anda melihat kesalahan “Terlalu banyak file terbuka” pesan di Linux, proses Anda telah mencapai batas atas file yang boleh dibuka, biasanya 1.024. Anda dapat meningkatkan batas sementara menjadi, misalnya, 2.048 file, dengan perintah “ulimit -n 2048”. Tingkatkan batas secara permanen dengan mengedit file konfigurasi systemd.
Pada komputer Linux, sumber daya sistem dibagi di antara pengguna. Cobalah untuk menggunakan lebih dari batas wajar Anda dan Anda akan mencapai batas atas. Anda mungkin juga menghambat pengguna atau proses lain.
Apa yang dimaksud dengan Kesalahan Terlalu Banyak File Terbuka?
Di antara trilyunan pekerjaan lainnya, kernel komputer Linux selalu sibuk mengamati siapa yang menggunakan berapa banyak sumber daya sistem yang terbatas, seperti RAM dan siklus CPU. Sistem multi-pengguna memerlukan perhatian terus-menerus untuk memastikan orang dan proses tidak menggunakan lebih banyak sumber daya sistem daripada yang seharusnya.
Tidak adil, misalnya, jika seseorang menghabiskan begitu banyak waktu CPU sehingga komputer terasa lambat untuk semua orang kalau tidak. Meskipun Anda satu-satunya orang yang menggunakan komputer Linux, ada batasan yang ditetapkan untuk sumber daya yang dapat digunakan oleh proses Anda. Bagaimanapun, Anda masih hanyalah pengguna lain.
Beberapa sumber daya sistem sudah diketahui dan jelas, seperti RAM, siklus CPU, dan ruang hard drive. Namun masih banyak lagi sumber daya yang dipantau dan 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 terbuka” di jendela terminal atau menemukannya di log sistem Anda, itu berarti batas atas telah telah kena, dan proses tidak diijinkan untuk membuka file lagi.
Mengapa Banyak sekali File yang Dibuka?
Ada batasan sistem untuk jumlah file terbuka yang dapat ditangani oleh Linux. Seperti yang akan kita lihat nanti, ini adalah angka yang sangat besar, namun masih ada batasnya. Setiap proses pengguna memiliki alokasi yang dapat mereka gunakan. Mereka masing-masing mendapat bagian kecil dari total sistem yang dialokasikan kepada mereka. Nbsp
Apa yang sebenarnya dialokasikan adalah sejumlah pegangan file. Setiap file yang dibuka memerlukan pegangan. Bahkan dengan alokasi yang cukup besar, di seluruh sistem, penanganan file dapat digunakan lebih cepat dari yang Anda bayangkan.
Linux mengabstraksi hampir semuanya sehingga tampak seolah-olah itu adalah sebuah file. Terkadang hanya berupa file biasa saja. Namun tindakan lain seperti membuka direktori juga menggunakan pegangan file. Linux menggunakan file blok 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.
Block 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 file handle. Perpustakaan yang digunakan oleh suatu 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 perpipaan dan aliran berfungsi.
Anda dapat melihat bahwa di balik layar Linux membuka file dan menggunakan pegangan file hanya untuk menjalankannya sendiri — apalagi proses pengguna Anda. Jumlah file yang terbuka bukan hanya jumlah file yang Anda buka. Hampir semua yang ada di sistem operasi menggunakan pegangan file.
Cara Memeriksa Batas Penanganan File
Jumlah maksimum pegangan file di seluruh sistem dapat dilihat dengan perintah ini.
cat /proc/sys/fs/file-max
Ini mengembalikan sejumlah besar yang tidak masuk akal 9,2 triliun. Itulah sistem teoritis maksimum. Ini adalah nilai terbesar yang dapat Anda simpan dalam bilangan bulat bertanda 64-bit. Apakah komputer Anda yang buruk benar-benar dapat menangani banyak file yang dibuka sekaligus adalah masalah lain. Nbsp
Pada tingkat pengguna, tidak ada nilai eksplisit untuk jumlah maksimum file terbuka yang dapat Anda miliki. Tapi secara kasar kita bisa menyelesaikannya. Untuk mengetahui jumlah maksimum file yang dapat dibuka oleh salah satu proses Anda, kita dapat menggunakan perintah ulimit dengan opsi -n (buka file).
ulimit -n
Dan untuk mengetahui jumlah maksimum proses yang dapat dimiliki pengguna, kami akan menggunakan ulimit dengan opsi -u (proses pengguna).
ulimit -u
Mengalikan 1024 dan 7640 menghasilkan 7.823.360. Tentu saja, banyak dari proses tersebut sudah digunakan oleh lingkungan desktop Anda dan proses latar belakang lainnya. Jadi itu adalah nilai maksimum teoritis lainnya, dan sesuatu yang tidak akan pernah Anda capai secara realistis. Angka yang 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 setel. Ini disebut batas lunak. Ada batas kerasnya juga, dan ini adalah nilai tertinggi yang dapat Anda naikkan batas lunaknya.
Cara memikirkan hal ini adalah batas lunak sebenarnya adalah “nilai saat ini” dan batas atas adalah nilai tertinggi yang bisa dimiliki nilai saat ini. mencapai. Pengguna biasa, non-root, dapat menaikkan batas lunaknya ke nilai berapa pun hingga batas kerasnya. Pengguna root dapat meningkatkan batas kerasnya.
Untuk melihat batas lunak dan keras saat ini, gunakan ulimit dengan opsi -S (lunak) dan -H (keras), serta opsi -n (buka file).
ulimit -Sn ulimit -Hn
To menciptakan situasi di mana kita dapat melihat batas lunak diberlakukan, kami membuat program yang berulang kali membuka file hingga gagal. Ia kemudian menunggu penekanan tombol sebelum melepaskan semua pegangan file yang digunakannya. Program ini disebut open-files.
./open-Files
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.
Kita dapat melihatnya menggunakan perintah lsof dengan opsi -p (proses) dan ID proses dari program file terbuka. Dengan mudah, ia mencetak ID prosesnya ke jendela terminal.
lsof -p 11038
Tentu saja, Dalam situasi dunia nyata, Anda mungkin tidak tahu proses mana yang baru saja melahap semua pegangan file. Untuk memulai penyelidikan, Anda dapat menggunakan rangkaian perintah yang disalurkan ini. Ini akan memberi tahu Anda lima belas pengguna pegangan file paling produktif di komputer Anda.
lsof | awk '{ print $1 " " $2; }' | sort -rn | unik -c | sort -rn | head -15
Untuk melihat lebih banyak atau lebih sedikit entri sesuaikan parameter -15 dengan perintah head. Setelah Anda mengidentifikasi prosesnya, Anda perlu mencari tahu apakah proses tersebut nakal dan membuka terlalu banyak file karena di luar kendali, atau apakah proses tersebut benar-benar memerlukan file tersebut. Jika memang membutuhkannya, Anda perlu meningkatkan batas penanganan filenya.
Cara 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 (buka file) dengan nilai numerik 2048. Ini akan menjadi batas lunak baru.
ulimit -n 2048
Kali ini kami berhasil membuka 2045 file. Seperti yang diharapkan, ini tiga kurang dari 2048, karena pegangan file yang digunakan untuk STDIN , STDOUT , dan STDERR.
Cara Mengubah Batas File Secara Permanen
Meningkatkan batas lunak hanya memengaruhi shell saat ini. Buka jendela terminal baru dan periksa batas lunaknya. Anda akan melihat itu adalah nilai default lama. Namun ada cara untuk menetapkan nilai default baru secara global untuk jumlah maksimum file terbuka yang dapat dimiliki suatu proses yang persisten dan bertahan saat reboot. NbspNasihat lama sering kali menyarankan Anda mengedit file seperti “/etc/sysctl.conf” dan “/etc/security/limits.conf.” Namun, pada distribusi berbasis systemd, pengeditan ini tidak berfungsi secara konsisten, terutama untuk sesi log-in grafis.
Teknik yang ditunjukkan di sini adalah cara 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
Search untuk baris yang berisi string “DefaultLimitNOFILE.” Hapus hash “#” dari awal baris, dan edit angka pertama sesuai batas lunak proses yang Anda inginkan. Kami memilih 4096. Angka kedua pada baris itu adalah batas keras. Kami tidak menyesuaikan ini.
Simpan file dan tutup editor.
Kami perlu mengulangi operasi itu pada file “/etc/systemd/user.conf”.
sudo gedit /etc/systemd/user.conf
Lakukan penyesuaian yang sama pada baris yang berisi string “DefaultLimitNOFILE.”
Simpan file dan tutup editor. Anda harus me-reboot komputer Anda atau menggunakan perintah systemctl dengan opsi daemon-reexec agar systemd dijalankan kembali dan menyerap pengaturan baru.
sudo systemctl daemon-reexec
Membuka jendela terminal dan memeriksa batas baru akan menampilkan nilai baru yang Anda tetapkan . Dalam kasus kami yaitu 4096.
ulimit -n
Kami dapat menguji ini adalah nilai operasional langsung dengan menjalankan kembali program serakah file kami.
./open-Files
Program gagal membuka file nomor 4094, artinya 4093 adalah file yang dibuka. Itu nilai yang kami harapkan, 3 kurang dari 4096.
Ingat Bahwa Semuanya adalah File
Itulah mengapa Linux sangat bergantung pada penanganan file. Sekarang, jika Anda mulai kehabisan, Anda tahu cara menambah kuota.