ป้ายสองป้ายถูกใช้ราวกับว่าเป็นสิ่งเดียวกัน: เร่งความเร็วด้วยฮาร์ดแวร์ และย้ายไปยังเคอร์เนล อย่างแรกอธิบายว่ารูทีน AES ของไลบรารีเรียกใช้คำสั่งใด อย่างที่สองอธิบายว่าการประมวลผลแพ็กเก็ตเกิดขึ้นที่ใด VPN สามารถมีอย่างแรกโดยไม่มีอย่างที่สอง มีอย่างที่สองโดยไม่มีอย่างแรก หรือมีทั้งสองอย่างพร้อมกัน การตัดสินใจใด ๆ เกี่ยวกับประสิทธิภาพต้องเริ่มด้วยการระบุว่าคุณกำลังเปลี่ยนสิ่งใดในสองสิ่งนี้จริง ๆ

สองแกน ไม่ใช่คะแนนเดียว

แกนแรกคือการนำไปใช้: โค้ดที่ทำ AES-256-GCM ถูกส่งไปยังเวอร์ชันที่ใช้คำสั่งเฉพาะของโปรเซสเซอร์ หรือไปยังรูทีนที่พกพาได้ซึ่งเรียกใช้คำสั่งเหล่านั้นเป็นการคำนวณธรรมดา ทางเลือกนี้อยู่ในไลบรารีคริปโตและถูกตัดสินเมื่อมันเริ่มทำงาน

แกนที่สองคือตำแหน่ง: แพ็กเก็ตผ่านเส้นทางการแปลงของเคอร์เนล หรือเดมอนในพื้นที่ผู้ใช้อ่านจากอุปกรณ์อุโมงค์ เข้ารหัส และเขียนกลับ

ไม่มีแกนใดจำกัดอีกแกนหนึ่ง VPN ในพื้นที่ผู้ใช้บน CPU ที่มีคำสั่ง AES สามารถใช้คำสั่งเหล่านั้นได้ตลอดเวลา และเส้นทางในเคอร์เนลบน CPU ที่ไม่มีคำสั่งเหล่านั้นจะกลับไปใช้การทำงานแบบซอฟต์แวร์ ป้ายในเอกสารของผู้จำหน่ายไม่ค่อยแสดงความแตกต่างนี้ จึงเป็นเหตุให้คำแนะนำในการปรับแต่งที่คัดลอกระหว่างสองสถานการณ์บ่อยครั้งไม่ได้ผลอะไร

แกนหนึ่ง: โค้ดใดทำการเข้ารหัส

OpenSSL ตรวจหาคุณสมบัติของโปรเซสเซอร์ระหว่างการเริ่มทำงาน และใช้ผลลัพธ์ในการเลือกเส้นทางโค้ดที่ปรับแต่งแล้ว ตามที่ เอกสารความสามารถของ x86 อธิบาย AES-NI เป็นหนึ่งในความสามารถที่บันทึกไว้เบื้องหลังการกระจายนั้น ไม่มีสิ่งใดในนี้ที่กำหนดให้ไลบรารีต้องกลายเป็นส่วนประกอบของเคอร์เนล

ยืนยันว่าคุณสมบัตินั้นมองเห็นได้จากโปรเซสก่อนที่จะถือว่าใช้เส้นทางเร็ว บน Linux แหล่งที่มาคือฟิลด์ flags ใน /proc/cpuinfo และภายในเครื่องเสมือนจะสะท้อนสิ่งที่ไฮเปอร์ไวเซอร์เปิดเผย ไม่ใช่ชื่อรุ่นของโฮสต์จริง

grep -m1 '^flags' /proc/cpuinfo | grep -o '\baes\b'
openssl list -providers -verbose

คำสั่งที่สองระบุชื่อผู้ให้บริการที่โหลดในบิลด์นั้น มันไม่ได้บอกว่าบริการ VPN เชื่อมโยงไลบรารีใด และโฮสต์หนึ่งอาจมี OpenSSL สองชุดติดตั้งอยู่ ในขณะที่โปรเซสที่ทำงานอยู่ใช้เพียงชุดเดียว

แกนสอง: เส้นทางแพ็กเก็ตทำงานที่ใด

การวางในเคอร์เนลหมายความว่าการแปลงเกิดขึ้นในกลไก IPsec ของเคอร์เนลเอง หรือในไดรเวอร์อุโมงค์ภายในเคอร์เนล ดังนั้นแพ็กเก็ตไม่จำเป็นต้องเดินทางไปกลับผ่านโปรเซสในพื้นที่ผู้ใช้สำหรับแต่ละชุด สิ่งนี้สามารถลดการคัดลอกและการสลับบริบท และกระจายงานไปยังคอร์ต่าง ๆ ในแบบที่เดมอนเธรดเดียวทำไม่ได้ นอกจากนี้ยังย้ายตัวนับและร่องรอยที่คุณจะอ่านเมื่อปริมาณงานลดลง เพราะงานเกิดขึ้นอีกด้านหนึ่งของขอบเขตที่คุณไม่ได้ควบคุม มองสิ่งนี้เป็นต้นทุนการดีบัก ไม่ใช่เพียงการตัดสินใจด้านประสิทธิภาพ

มันไม่ได้สร้างการรองรับคำสั่ง ไม่ได้กำหนดค่าไซเฟอร์ และไม่ได้ทำให้เส้นทางที่มีอยู่ทำงาน

การจำลองเสมือนเพิ่มรอยพับในแกนนี้ด้วย เครื่องเสมือนอาจได้โมเดล CPU ที่ปิดบังคุณสมบัติที่โฮสต์มี และเครื่องเสมือนซ้อนอาจเห็นน้อยลงไปอีก อ่านมุมมองความสามารถจากภายในสภาพแวดล้อมที่ VPN ทำงานจริง ไม่ใช่จากคอนโซลไฮเปอร์ไวเซอร์

แต่ละทางเลือกซื้ออะไร และทำอะไรไม่ได้

คำถามเชิงปฏิบัติคือเวลาไปที่ใด หากเธรดเดียวที่ยุ่ง การคัดลอกบัฟเฟอร์ซ้ำ ๆ หรือการเรียกระบบต่อแพ็กเก็ตจำกัดปริมาณงาน การย้ายการแปลงไปยังเส้นทางที่กำจัดต้นทุนเหล่านั้นอาจช่วยได้ โดยมีเงื่อนไขว่าเคอร์เนลนำการแปลงที่คุณต้องการไปใช้

หากขีดจำกัดคือลิงก์ขาขึ้นที่แออัด เส้นทางที่มีการสูญเสีย เวลาไปกลับนาน บริการปลายทางที่อิ่มตัว หรือเธรดเดียวที่ถูกปักไว้กับคอร์เดียว การวางตำแหน่งไม่เปลี่ยนสิ่งใดที่สำคัญ สิ่งเดียวกันใช้กับการเลือกคำสั่ง: AES บนฮาร์ดแวร์เฉพาะไม่สามารถซ่อมเส้นทางที่หายไป และจะไม่ช่วยหากอุโมงค์ว่างเพราะการแก้ชื่อล้มเหลว

ที่ใดที่ทั้งสองอย่างใช้ได้ พวกมันประกอบกัน เส้นทางในเคอร์เนลสามารถใช้การกระจายระดับคำสั่งเดียวกันภายใน API คริปโตของเคอร์เนล และเส้นทางในพื้นที่ผู้ใช้ที่มีไลบรารีที่เลือกดีก็ใช้มันอยู่แล้ว การตัดสินใจไม่ใช่ว่าอันไหนเร็วกว่าในเชิงนามธรรม แต่คือคุณมีหลักฐานสำหรับต้นทุนใด

จดข้อเท็จจริงสี่ข้อก่อนเปลี่ยนแปลงสิ่งใด

จดไบนารีของบริการและไลบรารีคริปโตที่มันเชื่อมโยงไว้ เพราะสิ่งเหล่านี้กำหนดแกนแรก จากนั้นบันทึกการป้องกันข้อมูลที่ตกลงกันไว้ เพราะไซเฟอร์ที่ไม่มีเส้นทางคำสั่งเฉพาะทำงานต่างจากที่มี และชุดจะถูกเลือกโดยทั้งสองฝ่าย

จากนั้น มุมมองความสามารถจากภายในสภาพแวดล้อมที่กำลังทำงาน และสุดท้ายเส้นทางแพ็กเก็ตที่ใช้งานอยู่พร้อมหลักฐานว่าโหมดที่คุณคิดว่าเปิดอยู่นั้นเปิดอยู่จริง โมดูลที่โหลดแล้วไม่ใช่หลักฐานว่าโปรไฟล์ใช้มัน และบรรทัดการกำหนดค่าไม่ใช่หลักฐานว่าเคอร์เนลยอมรับมัน

เปลี่ยนสิ่งเดียว แล้วเปรียบเทียบกับภาระงานที่สม่ำเสมอโดยมีปลายทางเดียวกันและทิศทางการถ่ายโอนเดียวกัน การอ้างความเร็วที่คุณไม่ได้วัดมีค่าน้อยกว่าบันทึกที่บอกว่าแบ็กเอนด์ไม่เคยเป็นที่สงสัย

บทความที่เกี่ยวข้อง