Relai VPN berhenti menerima SSH: had deskriptor fail
Trafik terowong terus mengalir sementara relai socat di belakangnya menolak sesi baharu. Jejaki laluan, kemudian baca had warisan pada PID yang hidup.
Jabat tangan WireGuard masih selesai, peer masih menunjukkan titik akhir terkini, namun sesi SSH baharu melalui relai di belakangnya tergantung tanpa sepanduk. Gabungan itu menjauhkan daripada terowong dan menuju proses yang menerima soket. Relai seperti socat duduk dalam laluan aplikasi dengan belanjawan deskriptornya sendiri, anak-anaknya sendiri dan had warisannya sendiri. Perjalanan di bawah bermula di klien dan berhenti pada komponen pertama yang tidak dapat membuka soket lain.
Jejaki laluan sebelum menukar nombor
Jejaki satu permintaan yang gagal daripada menaakul tentang terowong secara keseluruhan. Klien menulis ke dalam terowong, daemon VPN menyahsulit dan menghalakan, dan relai menerima di sebelah jauh. Setiap langkah menggunakan deskriptor, dan yang biasanya habis ialah yang terakhir.
Mulakan dengan permintaan yang boleh anda hasilkan semula dan ukur masanya. Jika jabat tangan TCP selesai tetapi tiada sepanduk aplikasi tiba, relai mengambil soket itu dan kemudian terhenti dalam anak atau pada kaki hulunya. Jika jabat tangan itu sendiri tidak pernah selesai, puncanya ialah penghalalan, tembok api atau keadaan pendengar, bukan siling deskriptor. Catat bentuk mana antara dua yang anda perhatikan, kerana kedua-duanya menunjuk kepada proses berbeza.
Kira juga lompatan yang menggandakan kerja. Pendengar bercabang menyerahkan setiap soket yang diterima kepada anak yang menyimpan salinannya sendiri, jadi jumlah sebenar ialah sifat seluruh pokok, bukan ibu bapa sahaja.
Baca had yang diwarisi oleh relai
Satu-satunya had yang penting milik proses yang sedang berjalan, dan ia ditetapkan oleh apa sahaja yang melancarkan proses itu. Menulis ulimit -n dalam shell menerangkan shell itu. Tanya pengurus perkhidmatan apa yang diterapkannya, kemudian sahkan pada PID.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
Fail limits mencetak siling lembut dan keras seperti yang dilihat oleh proses. Nilai lembut rendah di bawah nilai keras yang murah hati bermakna daemon dibenarkan menaikkan silingnya sendiri, dan sesetengahnya berbuat demikian semasa permulaan; nilai lembut rendah yang sama bermakna fail unit ialah sumbernya.
Drop-in dimuatkan dalam susunan leksikal dan fail kemudian menang, jadi systemctl cat vpn-relay.service ialah pandangan berwibawa tentang apa yang terpakai. Menyunting fail yang tidak pernah dibaca oleh pengurus ialah sebab paling biasa sesuatu nombor yang dinaikkan tidak berkesan.
Asingkan keselarian mantap daripada keadaan yang dikekalkan
Dua proses boleh mencapai siling yang sama atas sebab tidak berkaitan, dan ubatnya berbeza. Permintaan yang mengikut sesi serentak yang berguna ialah persoalan kapasiti. Pertumbuhan yang berterusan selepas kerja tamat ialah kebocoran atau set sesi yang tiada siapa tutup.
Ukur semasa melahu, pada puncak biasa anda, dan sekali lagi beberapa minit selepas beban berhenti. Mengira entri terbuka dengan ls /proc/PID/fd | wc -l berbanding had lembut memberitahu jurangnya, dan kiraan satu atau dua di bawah siling ialah hentian keras, bukan laluan perlahan.
Apabila kiraan enggan turun, lihat keadaan soket dan bukan jumlah. Deskriptor yang duduk dalam CLOSE_WAIT bermakna peer menutup dan pihak anda tidak pernah berbuat demikian, yang merupakan kecacatan kitaran hayat aplikasi yang hanya ditangguhkan oleh had lebih besar. Hadkan juga model anak: relai bercabang tanpa had atas anak serentak menghabiskan deskriptor, slot proses dan memori sekali gus.
Periksa nilai baharu pada proses yang hidup
Selepas menyunting unit, muat semula pengurus dan mulakan semula perkhidmatan, kerana muat semula sahaja tidak pernah menggantikan had yang sudah diwarisi oleh proses yang berjalan. Sahkan pada proses yang benar-benar menyediakan trafik.
systemctl daemon-reload
systemctl restart vpn-relay.service
awk '/Max open files/ {print}' /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
ss -tnp state established '( sport = :2222 )' | wc -l
Baris awk mengembalikan pasangan baharu; jika ia masih menunjukkan yang lama, drop-in yang anda sunting bukan yang dimuatkan. Kiraan ss ialah pemeriksaan beban kerja anda, jadi buka bilangan sesi yang anda jangkakan dan lihat ia meningkat. Kiraan yang terus meningkat selepas sesi itu ditutup bermakna had itu tidak pernah menjadi keseluruhan masalah.
Satu amaran mengiringi setiap kenaikan besar. Aplikasi yang mengundi dengan select() tidak dapat memerhati deskriptor melebihi FD_SETSIZE, iaitu 1024 pada binaan biasa, jadi siling yang dinaikkan melebihi itu boleh menghasilkan kegagalan yang kelihatan tidak berkaitan. Rujukan pelaksanaan systemd membawa amaran yang sama untuk perkhidmatan yang dilancarkannya.
Jauhkan permulaan semula daripada ketersediaan terowong
Memulakan semula relai menggugurkan sesi aktifnya, dan itu peristiwa berasingan daripada VPN turun. Susun perubahan supaya terowong kekal naik semasa relai berputar, dan beri amaran kepada sesiapa yang sesi panjangnya melintasinya.
Pengunduran ialah fail unit sebelumnya tambah satu lagi permulaan semula, dan fail itu kekal di tempatnya sehingga nilai baharu bertahan satu hari bekerja. Kemudian tutup gelung dengan permintaan yang pada asalnya gagal: satu sesi SSH baharu melalui relai, satu pemindahan cukup panjang untuk bermakna, dan kiraan deskriptor yang kembali ke tahap melahunya.