Mengapa jumlah file terbuka terbatas di Linux?

136

Saat ini, saya tahu cara:

  • temukan batas file terbuka per proses: ulimit -n
  • hitung semua file yang dibuka oleh semua proses: lsof | wc -l
  • dapatkan jumlah maksimum file terbuka yang dibolehkan: cat /proc/sys/fs/file-max

Pertanyaan saya adalah: Mengapa ada batasan file terbuka di Linux?

xanpeng
sumber
2
@Rob Googled sedikit dan menemukan bahwa itu adalah bom fork , dapatkah itu digunakan untuk menjelaskan batas file terbuka?
xanpeng
6
Nah, batas proses dan batas file adalah penting sehingga hal-hal seperti bom garpu tidak merusak server / komputer untuk semua pengguna, hanya pengguna yang melakukannya dan hanya sementara. Jika tidak, seseorang di server bersama dapat mematikan forkbomb dan sepenuhnya menjatuhkannya untuk semua pengguna, bukan hanya mereka sendiri.
Rob
3
Bagus sekali merangkum beberapa perintah yang sangat berguna! : +1:
Joshua Pinter
7
@Rob, bom fork tidak ada hubungannya dengan itu karena batas file adalah per proses dan setiap kali Anda fork tidak membuka pegangan file baru.
psusi

Jawaban:

86

Alasannya adalah bahwa sistem operasi membutuhkan memori untuk mengelola setiap file yang terbuka, dan memori adalah sumber daya yang terbatas - terutama pada sistem embedded.

Sebagai pengguna root, Anda dapat mengubah jumlah file terbuka maksimum per proses (via ulimit -n) dan per sistem (misalnya echo 800000 > /proc/sys/fs/file-max).

Jofel
sumber
21
Ada juga alasan keamanan: jika tidak ada batasan, perangkat lunak userland akan dapat membuat file tanpa henti sampai server turun.
Coren
15
@Coren Batas yang dibahas di sini hanya untuk hitungan penangan file terbuka. Karena suatu program juga dapat menutup penangan file, ia dapat membuat file sebanyak dan sebesar yang diinginkan, sampai semua ruang disk yang tersedia penuh. Untuk mencegah hal ini, Anda dapat menggunakan kuota disk atau partisi yang terpisah. Anda benar dalam arti, bahwa salah satu aspek keamanan mencegah kehabisan sumber daya - dan untuk ini ada batasnya.
jofel
1
@ jofel Terima kasih. Saya kira pegangan file yang dibuka diwakili oleh contoh-contoh file struct , dan ukuran struct ini cukup kecil (level byte), jadi dapatkah saya menetapkan /.../file-maxdengan nilai yang cukup besar selama memori tidak digunakan?
xanpeng
7
@xanpeng Saya bukan pakar kernel, tetapi sejauh yang saya bisa lihat, default untuk file-maxtampaknya adalah ukuran RAM dibagi 10k. Karena memori sebenarnya yang digunakan per file handler harus jauh lebih kecil (ukuran struct fileplus beberapa memori tergantung driver), ini tampaknya batas yang cukup konservatif.
jofel
63

Harap dicatat bahwa lsof | wc -lmeringkas banyak entri yang digandakan (proses bercabang dapat berbagi file menangani dll). Angka itu bisa jauh lebih tinggi dari batas yang ditetapkan /proc/sys/fs/file-max.

Untuk mendapatkan jumlah file terbuka saat ini dari sudut pandang kernel Linux, lakukan ini:

cat /proc/sys/fs/file-nr

Contoh: Server ini memiliki 40096 dari maks 65536 file terbuka, walaupun dilaporkan jumlah yang jauh lebih besar:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504
grebneke
sumber
1
Seperti yang lsofakan melaporkan banyak file dua kali atau lebih, seperti /dev/null, Anda dapat mencoba tebak terbaik dengan:lsof|awk '{print $9}'|sort|uniq|wc -l
Yvan
Anda dapat menggunakan lsof|awk '!a[$NF]++{c++}END{print c}'untuk mendapatkan jumlah file terbuka non-duplikat.
P ....
18

Saya pikir ini sebagian besar karena alasan historis.

Sebuah file descriptor Unix adalah kecil intnilai, dikembalikan oleh fungsi seperti opendan creat, dan diteruskan ke read, write, close, dan sebagainya.

Setidaknya dalam versi awal Unix, deskriptor file hanyalah sebuah indeks ke dalam array struktur ukuran-tetap per proses, di mana setiap struktur berisi informasi tentang file yang terbuka. Jika saya ingat dengan benar, beberapa sistem awal membatasi ukuran tabel ini hingga 20 atau lebih.

Lebih banyak sistem modern memiliki batas yang lebih tinggi, tetapi telah mempertahankan skema umum yang sama, sebagian besar di luar inersia.

Keith Thompson
sumber
1
20 adalah batas Solaris untuk struktur data FILE bahasa C. Jumlah file handle selalu lebih besar.
Lothar
@Lothar: Menarik. Saya bertanya-tanya mengapa batasannya akan berbeda. Mengingat filenodan fdopenfungsinya, saya berharap mereka hampir saling dipertukarkan.
Keith Thompson
File unix lebih dari sekadar file handle (int) yang dikembalikan. Ada buffer disk, dan blok kontrol file yang menentukan offset file saat ini, pemilik file, izin, inode, dll.
ChuckCottrill
@ ChuckCottrill: Ya, tentu saja. Tetapi sebagian besar informasi itu harus disimpan baik file diakses melalui intdeskriptor atau FILE*. Jika Anda memiliki lebih dari 20 file yang terbuka open(), apakah akan fdopen()gagal?
Keith Thompson