ตัวนับทราฟฟิกของ OpenVPN กับ I/O ของดิสก์: ตัวเลขสามแบบที่ต่างกัน
ไบต์ของอินเทอร์เฟซ ตัวนับอักขระของโปรเซส และการเขียนลงดิสก์วัดงานคนละแบบ เปรียบเทียบก่อนกำหนดขนาดดิสก์จากปริมาณทราฟฟิกของทันเนล
ส่งไฟล์ใหญ่ผ่านทันเนลแล้วตัวนับของอินเทอร์เฟซจะเพิ่มขึ้นเท่าขนาดไฟล์ ไม่มีอะไรในตัวเลขนั้นบอกว่าปริมาณเดียวกันไปถึงดิสก์ การคุยกันแบบนี้มักเอาสามการวัดที่ต่างกันมาเทียบกัน และทั้งสามตอบคำถามคนละข้อ: ทราฟฟิกผ่านชั้นเครือข่ายไปเท่าไร โปรเซสอ่านและเขียนกี่ไบต์ผ่านการเรียกซิสเต็ม และมีงานไปถึงชั้นจัดเก็บมากแค่ไหน
การเอาตัวแรกไปเทียบกับตัวที่สามคือข้อผิดพลาดที่พบบ่อย และมันสร้างปัญหาดิสก์แบบผีหรือแผนความจุที่ไม่สนใจการเขียนที่เกิดขึ้นจริง สามอย่างนี้แยกจากกันได้ และแต่ละอย่างมีวิธีใช้ที่ถูกต้อง
ตัวเลขสามตัวที่ถูกทำให้สับสน
ตัวนับของอินเทอร์เฟซอธิบายทราฟฟิกที่ถูกจัดการในชั้นเครือข่าย เป็นตัวเลขที่ถูกต้องสำหรับแบนด์วิดท์ ขนาดของทันเนล และโมเดลการเรียกเก็บเงินที่คิดราคาการส่งผ่าน
ตัวนับอักขระของโปรเซสอธิบายไบต์ที่ถูกย้ายผ่านการเรียกอ่านและเขียนบนตัวอธิบายใด ๆ รวมถึงไปป์ เทอร์มินัล และอุปกรณ์อักขระ เป็นตัวเลขที่ถูกต้องสำหรับถามว่าโปรเซสยุ่งแค่ไหนที่ขอบของการเรียกซิสเต็ม และไม่ใช่ใบเรียกเก็บเงินค่าจัดเก็บ
ตัวนับการจัดเก็บอธิบายไบต์ที่เคอร์เนลพยายามย้ายไปยังหรือออกจากอุปกรณ์บล็อก เป็นตัวเลขที่ถูกต้องสำหรับการวางแผนความจุ โดยมีข้อแม้ว่าเคอร์เนลบันทึกขีดจำกัดการบัญชีของตัวเองไว้: การอ่านที่แคชไว้ไม่กลายเป็นการอ่านจากที่จัดเก็บ และการเขียนที่ถูกยกเลิกภายหลังไม่กลายเป็นการเขียนอุปกรณ์ที่เสร็จสมบูรณ์
| Measurement | Question it answers |
|---|---|
| Interface bytes | How much traffic crossed this layer |
rchar and wchar | How much data the process moved through system calls |
read_bytes and write_bytes | How much work reached the storage layer |
ทำไมตัวอธิบายไฟล์ไม่ใช่การเขียนลงดิสก์
VPN ในพื้นที่ผู้ใช้แลกเปลี่ยนแพ็กเก็ตกับเคอร์เนลผ่านอุปกรณ์ TUN ซึ่งเป็นอุปกรณ์อักขระไม่ใช่ไฟล์ปกติ การอ่านจากมันส่งมอบแพ็กเก็ต การเขียนลงมันฉีดแพ็กเก็ตเข้าไป ไม่มีหน้าของเนื้อหาไฟล์ที่ถูกเตรียมไว้สำหรับการจัดเก็บ และไม่มีเส้นทางของระบบไฟล์เข้าเกี่ยวข้อง
นี่คือเหตุผลที่ทันเนลที่ยุ่งสามารถแสดงตัวนับอักขระมหาศาลโดยแทบไม่มีตัวนับการจัดเก็บ โปรเซสย้ายไบต์เหล่านั้นจริง และเคอร์เนลก็ไม่จำเป็นต้องใช้ดิสก์จริง ๆ ในการทำเช่นนั้น
cat /proc/$(pgrep -n openvpn)/io
ip -s link show tun0
อ่านผลลัพธ์แรกเป็นค่าสะสมตั้งแต่โปรเซสเริ่ม ไม่ใช่อัตรา ผลลัพธ์ที่สองให้มุมมองของอินเทอร์เฟซต่อทราฟฟิกเดียวกัน ช่องว่างใหญ่ระหว่างสองอย่างนี้เป็นเรื่องที่คาดไว้ และไม่ได้บ่งชี้การรั่วไหล คิว หรือการตั้งค่าผิด
ไบต์มาจากไหนจริง ๆ
ผลลัพธ์แบบต่อเนื่องมีงบประมาณของตัวเอง และมันถูกขับด้วยการทำงาน ไม่ใช่เพย์โหลด ระดับล็อกที่ละเอียด รายชื่อไคลเอนต์ที่เปลี่ยนบ่อย หรือข้อผิดพลาดที่เกิดซ้ำในลูปแน่น ๆ สามารถสร้างการเขียนจำนวนมากในขณะที่ทันเนลแบกข้อมูลน้อยมาก
ไฟล์สถานะคือภาพรวมที่ถูกเขียนใหม่ตามช่วงเวลา ดังนั้นค่าใช้จ่ายขึ้นอยู่กับช่วงเวลาและจำนวนเรกคอร์ดที่มันมี ไม่ใช่สำเนาที่เดินอยู่ของทราฟฟิกของไคลเอนต์ทุกตัว และการย่อช่วงเวลาให้สั้นลงเปลี่ยนปริมาณการเขียนโดยไม่เปลี่ยนปริมาณทราฟฟิก
ความเป็นเจ้าของสำคัญเมื่อคุณตามหาการเขียนเหล่านั้น ถ้าบริการส่งข้อความให้ดีมอนบันทึกแยก ไฟล์บันทึกหรือเจอร์นัลจะถูกเขียนโดยดีมอนนั้น และไบต์จะไปปรากฏในการบัญชีของดีมอน ไม่ใช่ในตัวนับของโปรเซส VPN เอง การดูแค่โปรเซส VPN ไม่ได้อธิบายทั้งกิจกรรมของดิสก์และการที่มันไม่มี
ผู้ร่วมสมทบรายอื่นนั้นถูกมองข้ามได้ง่าย: การอ่านใบรับรองและการตั้งค่าตอนเริ่มระบบ ฮุกที่เขียนบันทึกของตัวเอง ปลั๊กอินการบัญชี ดัมพ์จากการพัง และภาระงานที่ไม่เกี่ยวข้องบนโฮสต์เดียวกัน ไม่ควรประเมินสิ่งเหล่านี้ด้วยการทำให้ทราฟฟิกของทันเนลเท่ากับไบต์ที่เขียน
อ่านตัวนับแต่ละตัวให้ถูกต้อง
รายละเอียดสามอย่างตัดสินว่าการเปรียบเทียบมีความหมายหรือไม่ อัตลักษณ์ของโปรเซสสำคัญ เพราะบริการที่เริ่มใหม่จะรีเซ็ตตัวนับของมัน ช่วงเวลาสำคัญ เพราะตัวเลขสะสมกับกราฟต่อวินาทีเป็นการวัดคนละแบบ และหน่วยก็สำคัญ เพราะขนาดปัจจุบันของไฟล์บันทึกก็ไม่ใช่อัตราเช่นกัน
grep -E 'rchar|wchar|read_bytes|write_bytes' /proc/$(pgrep -n openvpn)/io
du -sh /var/log/openvpn 2>/dev/null
journalctl --disk-usage
ถ้าคุณสงสัยว่ามีการเขียนเพย์โหลดจริง ให้มองหาองค์ประกอบที่หน้าที่คือจัดเก็บเพย์โหลด: เครื่องมือดักจับแพ็กเก็ต พร็อกซีที่แคชเนื้อหา ปลั๊กอินที่เก็บถาวร สิ่งเหล่านี้สร้างทราฟฟิกไปยังที่จัดเก็บที่ขยายตามสิ่งที่ถูกขอให้บันทึก และมันขึ้นอยู่กับการตัดสินใจเชิงนโยบายแยกต่างหากเรื่องการเก็บรักษาและการเข้าถึง
วางแผนความจุด้วยตัวเลขที่ถูกต้อง
กำหนดขนาดเส้นทางแพ็กเก็ตด้วยตัวเลขเครือข่าย: อัตราการส่งผ่าน การประมวลผลการเข้ารหัส และการเคลื่อนย้ายหน่วยความจำ กำหนดขนาดที่จัดเก็บด้วยการตัดสินใจเรื่องการสังเกตที่คุณเลือกจริง: ระดับล็อก การเก็บรักษา ช่วงเวลาสถานะ และการดักจับใด ๆ ที่เปิดไว้โดยเจตนา
การแยกงบประมาณสองก้อนนี้ออกจากกันยังทำให้อ่านเหตุการณ์ได้ง่ายขึ้น ดิสก์เต็มทั้งที่มีทราฟฟิกทันเนลปานกลางชี้ไปที่ล็อก การดักจับ หรืออะไรที่ไม่เกี่ยวข้อง และตัวนับอินเทอร์เฟซจะไม่มีวันอธิบายมันได้ ลิงก์อิ่มตัวทั้งที่ล็อกเงียบชี้ไปทางตรงกันข้าม
การเปรียบเทียบที่คุ้มค่าคือระหว่างการวัดชนิดเดียวกัน ไบต์ของอินเทอร์เฟซเทียบกับไบต์ของอินเทอร์เฟซตามเวลา บอกคุณเกี่ยวกับเส้นทาง การเขียนไปยังที่จัดเก็บเทียบกับความจุที่จัดเก็บ บอกคุณเกี่ยวกับการเก็บรักษา การเปรียบเทียบข้ามชนิด คือทราฟฟิกเทียบกับดิสก์ ดูเหมือนมีความหมายเท่านั้น และไม่เคยเป็นเช่นนั้นเลย