... Saya pikir pada titik di mana ini menjadi kekhawatiran yang sebenarnya daripada keingintahuan akademik Anda telah jauh melewati titik di mana akan lebih bijaksana untuk membuat server DNS pribadi dalam hal kinerja dan pemeliharaan.
Shadur
5
Saya terkejut Anda bertanya. Mengapa Anda mengharapkan batas ukuran yang bermakna dan sulit pada file konfigurasi?
Basile Starynkevitch
3
@ BasileStarynkevitch saya bertanya karena file host ~ 2 MB tidak berfungsi pada router saya, tetapi masalahnya adalah bahwa saya tidak sighup dnsmasq untuk membaca kembali file host.
Geremia
2
@Geremia file host saya adalah 500M, 15.000+ entri, tidak ada masalah. Itu selalu yang terbaik untuk menentukan akar penyebab masalah Anda dan menyelesaikannya terlebih dahulu
bsd
3
Apakah Anda menggunakan file host untuk memblokir alamat IP? Jika demikian, Anda harus menggunakan iptables dengan ipset. Menggunakan iptables saja akan menyebabkan hit kinerja besar, namun dengan ipset daftar hampir 500.000 ips memiliki dampak yang dapat diabaikan.
cybernard
Jawaban:
57
Efek bermasalah termasuk resolusi hostname lambat (kecuali OS entah bagaimana mengubah daftar linier menjadi struktur pencarian yang lebih cepat?) Dan potensi interaksi yang mengejutkan dengan tabpenyelesaian shell jauh sebelum ukuran file yang berarti tercapai.
Sebagai contoh! Jika satu tempat 500.000 entri host di/etc/hosts
untuk sains, tabpenyelesaian nama host default di ZSH membutuhkan sekitar ~ 25 detik pada sistem saya untuk mengembalikan prompt penyelesaian (memang, ini ada di laptop mulai 2008 dengan disk 5400 RPM, tapi tetap saja).
Saya tidak berpikir itu memiliki batas ukuran dalam hal jumlah garis.
Sebelum DNS (yang mulai digunakan pada tahun 1985), file inilah yang menjadi satu-satunya cara untuk melakukan pencarian nama host, jadi saya berasumsi bahwa ini berarti file tersebut harus dapat memiliki ribuan atau setidaknya ratusan entri untuk dapat mendukung node Internet pra-1985 yang paling terhubung dengan baik.
Berikut adalah contoh dari tahun 1985 (formatnya agak berubah): http://jim.rees.org/apollo-archive/hosts.txt File ini memiliki 1680 baris dari yang 1325 adalah baris host. 355 baris yang tersisa kosong, komentar, jaringan atau gateway 1 .
Satu-satunya batasan nyata yang dapat saya temukan adalah bahwa pada beberapa sistem, garis individual dibatasi hingga kurang dari BUFSIZkarakter (1024 pada mesin OpenBSD saya).
Jika Anda memiliki lebih dari beberapa entri /etc/hosts, Anda harus mempertimbangkan untuk menyiapkan server nama lokal, tetapi itulah pendapat pribadi saya.
1 Terima kasih kepada Jeff Schaller karena telah menggali ini.
Sebelum DNS, saya pikir itu tidak biasa untuk mengubah tabel host Internet lengkap ke /etc/hostsformat. Sebagian besar sistem Unix bahkan tidak ada di Internet, dan bahkan jika sebuah mesin, itu tidak memerlukan tabel host lengkap, hanya segelintir mesin yang perlu diajak bicara. Saya akan terkejut jika ada banyak mesin dengan lebih dari 100 entri.
Barmar
13
Bagaimana saya bisa menentukan batas ukuran / etc / hosts?
Ini adalah file biasa, jadi batasnya akan sesuai dengan batas filesystem yang mendasari (yang dengan sendirinya dibatasi oleh jumlah disk di belakangnya), minus ruang yang digunakan oleh file lain dalam /filesystem yang sama (mungkin root ( )):
ext2 / 3: 2 TiB
ext4: 16 TiB (dengan ukuran blok 4KiB default)
xfs: 500 TiB
Bagaimana saya bisa mengatur batas ukuran / etc / hosts?
Karena ini adalah file yang diedit secara manual, hanya secara manual:
Benar pada prinsipnya, tetapi batas sistem file (misalnya terabyte) secara praktis sebagian besar tidak relevan.
Basile Starynkevitch
11
Batas ukuran hanya berlaku ketika mengalokasikan buffer statis. gethostbyname(3), yang mem-parsing entri /etc/hosts, tidak mengalokasikan buffer statis - dan tidak pernah. Rilis asli algoritma BSD 4.3 tahun 1983 menunjukkan file terbuka, sementara parse line, pola file dekat:
sethostent(0);
while (p = gethostent()) {
if (strcmp(p->h_name, name) == 0)
break;
for (cp = p->h_aliases; *cp != 0; cp++)
if (strcmp(*cp, name) == 0)
goto found;
}
found:
endhostent();
Implementasi modern mempertahankan warisan ini dalam semua hal yang penting.
Bagaimanapun, secara internal, *hostentkeluarga fungsi menyimpan pointer file ke baris saat ini dalam file. sethostentmembuka file dan mengatur posisi penunjuk file. gethostentmendapat data dan memajukan pointer. endhostentmenutup penunjuk file. Perpustakaan C GNU menawarkan referensi menyeluruh tentang fungsi-fungsi ini.
Seperti yang Anda tebak dari implementasi, entri yang terjadi sebelumnya di file menyelesaikan lebih cepat. Jika file host Anda sangat besar, ini mulai berlaku.
Jadi, tidak peduli seberapa besar file tersebut, OS akan mengkonsumsinya. Namun, pada akhirnya, Anda akan mencapai batas filesystem (sesuai jawaban Jeff Schaller ). Anda juga memiliki batas ukuran garis maksimum (per jawaban Kusalananda ). Tapi, pada akhirnya, Anda bisa menjadikannya sebesar yang Anda inginkan. Tapi tolong, jangan.
Menggunakan glibc dan linux, sayangnya ini tidak mudah. Jika Anda memanggil gethostbyname dan sistem diatur sesuai (default pada banyak sistem) maka itu bukan membaca / etc / host memanggil nscd. Saya tidak tahu apakah nscd akan melakukan cache hanya hits di file atau mencoba untuk cache secara keseluruhan. Dalam kasus selanjutnya, Anda akan memiliki batasan ram untuk ukuran file (dengan asumsi bahwa konfigurasi nscd memungkinkan banyak entri)
PlasmaHH
1
Versi 4.3BSD ada di sini . Ini mendukung versi / etc / hosts hash dbm. IIRC, dbm memberlakukan beberapa batasan ukuran yang dapat menyebabkan upaya untuk membuat hash db gagal.
Mark Plotnick
2
... Saya telah memutar otak dan untuk kehidupan saya, saya tidak dapat memikirkan satu situasi atau keadaan di mana Anda akan mendekati segala jenis masalah batas ukuran /etc/hosts- Anda akan mengalami masalah praktis seperti yang parah hit kinerja ke getaddrinfo()keluarga panggilan sistem yang semua harus berkonsultasi file sebelum memutuskan apakah akan mengirim permintaan DNS, untuk mengatakan tidak ada masalah mempertahankan file teks datar ukuran itu.
Saya menduga bahwa apa yang kita miliki di sini adalah kegagalan untuk berkomunikasi di tingkat yang lebih tinggi. Masalah apa yang Anda coba selesaikan dengan /etc/hostsfile raksasa ? Saya hampir yakin ada solusi yang lebih baik dari ini.
Beberapa orang menggunakan hostsfile untuk daftar hitam iklan / malware / pelacakan / dll. Ada daftar yang dikuratori di internet, yang saya gunakan adalah 41k baris dan ukuran 1.1MB.
Bert
Mungkin akan lebih baik untuk menggunakan kinerja dnsmasquntuk itu - lihat misalnya dnsgate (yang saya belum coba).
reinierpost
Milik saya memiliki 1,7MB dengan garis 57k. Anda bisa mendapatkan /etc/hostsfile besar Anda dari hostsfile.org
Jawaban:
Efek bermasalah termasuk resolusi hostname lambat (kecuali OS entah bagaimana mengubah daftar linier menjadi struktur pencarian yang lebih cepat?) Dan potensi interaksi yang mengejutkan dengan tabpenyelesaian shell jauh sebelum ukuran file yang berarti tercapai.
Sebagai contoh! Jika satu tempat 500.000 entri host di
/etc/hosts
untuk sains, tabpenyelesaian nama host default di ZSH membutuhkan sekitar ~ 25 detik pada sistem saya untuk mengembalikan prompt penyelesaian (memang, ini ada di laptop mulai 2008 dengan disk 5400 RPM, tapi tetap saja).
sumber
Saya tidak berpikir itu memiliki batas ukuran dalam hal jumlah garis.
Sebelum DNS (yang mulai digunakan pada tahun 1985), file inilah yang menjadi satu-satunya cara untuk melakukan pencarian nama host, jadi saya berasumsi bahwa ini berarti file tersebut harus dapat memiliki ribuan atau setidaknya ratusan entri untuk dapat mendukung node Internet pra-1985 yang paling terhubung dengan baik.
Berikut adalah contoh dari tahun 1985 (formatnya agak berubah): http://jim.rees.org/apollo-archive/hosts.txt File ini memiliki 1680 baris dari yang 1325 adalah baris host. 355 baris yang tersisa kosong, komentar, jaringan atau gateway 1 .
Satu-satunya batasan nyata yang dapat saya temukan adalah bahwa pada beberapa sistem, garis individual dibatasi hingga kurang dari
BUFSIZ
karakter (1024 pada mesin OpenBSD saya).Jika Anda memiliki lebih dari beberapa entri
/etc/hosts
, Anda harus mempertimbangkan untuk menyiapkan server nama lokal, tetapi itulah pendapat pribadi saya.1 Terima kasih kepada Jeff Schaller karena telah menggali ini.
sumber
/etc/hosts
format. Sebagian besar sistem Unix bahkan tidak ada di Internet, dan bahkan jika sebuah mesin, itu tidak memerlukan tabel host lengkap, hanya segelintir mesin yang perlu diajak bicara. Saya akan terkejut jika ada banyak mesin dengan lebih dari 100 entri.Ini adalah file biasa, jadi batasnya akan sesuai dengan batas filesystem yang mendasari (yang dengan sendirinya dibatasi oleh jumlah disk di belakangnya), minus ruang yang digunakan oleh file lain dalam
/
filesystem yang sama (mungkin root ( )):Karena ini adalah file yang diedit secara manual, hanya secara manual:
(untuk menghapus garis 100 dan seterusnya).
sumber
Batas ukuran hanya berlaku ketika mengalokasikan buffer statis.
gethostbyname(3)
, yang mem-parsing entri/etc/hosts
, tidak mengalokasikan buffer statis - dan tidak pernah. Rilis asli algoritma BSD 4.3 tahun 1983 menunjukkan file terbuka, sementara parse line, pola file dekat:Implementasi modern mempertahankan warisan ini dalam semua hal yang penting.
Bagaimanapun, secara internal,
*hostent
keluarga fungsi menyimpan pointer file ke baris saat ini dalam file.sethostent
membuka file dan mengatur posisi penunjuk file.gethostent
mendapat data dan memajukan pointer.endhostent
menutup penunjuk file. Perpustakaan C GNU menawarkan referensi menyeluruh tentang fungsi-fungsi ini.Seperti yang Anda tebak dari implementasi, entri yang terjadi sebelumnya di file menyelesaikan lebih cepat. Jika file host Anda sangat besar, ini mulai berlaku.
Jadi, tidak peduli seberapa besar file tersebut, OS akan mengkonsumsinya. Namun, pada akhirnya, Anda akan mencapai batas filesystem (sesuai jawaban Jeff Schaller ). Anda juga memiliki batas ukuran garis maksimum (per jawaban Kusalananda ). Tapi, pada akhirnya, Anda bisa menjadikannya sebesar yang Anda inginkan. Tapi tolong, jangan.
sumber
... Saya telah memutar otak dan untuk kehidupan saya, saya tidak dapat memikirkan satu situasi atau keadaan di mana Anda akan mendekati segala jenis masalah batas ukuran
/etc/hosts
- Anda akan mengalami masalah praktis seperti yang parah hit kinerja kegetaddrinfo()
keluarga panggilan sistem yang semua harus berkonsultasi file sebelum memutuskan apakah akan mengirim permintaan DNS, untuk mengatakan tidak ada masalah mempertahankan file teks datar ukuran itu.Saya menduga bahwa apa yang kita miliki di sini adalah kegagalan untuk berkomunikasi di tingkat yang lebih tinggi. Masalah apa yang Anda coba selesaikan dengan
/etc/hosts
file raksasa ? Saya hampir yakin ada solusi yang lebih baik dari ini.sumber
hosts
file untuk daftar hitam iklan / malware / pelacakan / dll. Ada daftar yang dikuratori di internet, yang saya gunakan adalah 41k baris dan ukuran 1.1MB.dnsmasq
untuk itu - lihat misalnya dnsgate (yang saya belum coba)./etc/hosts
file besar Anda dari hostsfile.org