Một nghiên cứu hiệu suất gần đây đã làm bùng nổ các cuộc thảo luận về công nghệ Common Gateway Interface ( CGI ), với những kết quả đáng ngạc nhiên thách thức các giả định phổ biến về các phương pháp phát triển web. Bài kiểm tra đã thử nghiệm nhiều ngôn ngữ lập trình chạy các script CGI trên máy chủ AMD 60 nhân, tiết lộ sự khác biệt hiệu suất đáng kể và khơi mào các cuộc tranh luận về việc liệu các công nghệ cũ có đáng được xem xét lại hay không.
![]() |
---|
Tổng quan về việc sử dụng công nghệ CGI với Rust cho các yêu cầu web hiệu suất cao, nhấn mạnh tính liên quan liên tục của các công nghệ cũ trong phát triển web hiện đại |
Kết Quả Hiệu Suất Tiết Lộ Thứ Bậc Rõ Ràng Giữa Các Ngôn Ngữ
Kết quả kiểm tra cho thấy sự khác biệt hiệu suất đáng kể giữa các ngôn ngữ lập trình khác nhau. Các ngôn ngữ biên dịch thống trị bảng xếp hạng hiệu suất, với C dẫn đầu ở mức khoảng 5.800 yêu cầu mỗi giây, theo sát là Rust với 5.700 yêu cầu mỗi giây. Go đạt 3.400 yêu cầu mỗi giây mặc dù có chi phí khởi tạo runtime. Trong số các ngôn ngữ thông dịch, Python đạt 700 yêu cầu mỗi giây, trong khi JavaScript với Node.js khiến nhiều người ngạc nhiên khi đạt 600 yêu cầu mỗi giây. Perl đạt 500 yêu cầu mỗi giây, và các script Bash chỉ đạt được 40 yêu cầu mỗi giây trong khi tiêu thụ toàn bộ tài nguyên CPU có sẵn.
CGI (Common Gateway Interface): Một giao thức tiêu chuẩn cho phép máy chủ web thực thi các chương trình và trả về đầu ra của chúng dưới dạng trang web
Kết quả Benchmark Hiệu suất CGI (Số yêu cầu mỗi giây)
Ngôn ngữ | Hiệu suất | Ghi chú |
---|---|---|
C | ~5,800 req/s | Hiệu suất cao nhất |
Rust | ~5,700 req/s | Rất gần với hiệu suất của C |
Go | ~3,400 req/s | Mặc dù có overhead khởi tạo runtime |
Python | ~700 req/s | Đáng kể đối với ngôn ngữ thông dịch |
JavaScript ( Node.js ) | ~600 req/s | Hiệu suất tốt một cách bất ngờ |
Perl | ~500 req/s | Hiệu suất khá tốt cho ngôn ngữ scripting |
Bash | ~40 req/s | Đã bão hòa tất cả CPU có sẵn |
Môi trường Test: Máy ảo 60 VCPU dựa trên AMD Genoa với 240 GB RAM
Cộng Đồng Tranh Luận Về Độ Phức Tạp Phát Triển Web Hiện Đại
Kết quả hiệu suất đã khơi mào các cuộc thảo luận rộng hơn về độ phức tạp phát triển web và việc quay trở lại các công nghệ đơn giản hơn. Nhiều developer bày tỏ sự thất vọng với các framework JavaScript hiện đại và chuỗi công cụ liên quan. Một thành viên cộng đồng lưu ý rằng ChatGPT đã làm hồi sinh sự quan tâm đến vanilla JavaScript và jQuery , thấy rằng gánh nặng tinh thần nhẹ hơn nhiều so với các pattern useCallback, useEffect và useMemo của React , mà họ so sánh với việc quản lý bộ nhớ thủ công trong lập trình C .
Cuộc thảo luận mở rộng đến môi trường doanh nghiệp nơi các developer quan sát thấy các hệ thống được cung cấp tài nguyên quá mức một cách khổng lồ. Các ứng dụng doanh nghiệp thường yêu cầu tài nguyên khổng lồ cho các tác vụ tương đối đơn giản, với một ví dụ trích dẫn về ứng dụng giám sát sử dụng 500MB bộ nhớ cho mỗi hệ thống được giám sát chỉ để poll dữ liệu mỗi năm phút.
Sự Liên Quan Bất Ngờ Của CGI Trong Điện Toán Hiện Đại
Mặc dù được coi là lỗi thời, CGI đang tìm thấy những người ủng hộ mới lập luận rằng sự đơn giản của nó mang lại lợi thế trong các tình huống cụ thể. Công nghệ này cung cấp sự cô lập process hoàn toàn, tự động dọn dẹp bộ nhớ, và loại bỏ lo ngại về quản lý process chạy lâu dài. Mỗi yêu cầu chạy trong process riêng của nó, kết thúc sau khi hoàn thành, ngăn chặn rò rỉ bộ nhớ và giảm rủi ro bảo mật giữa các yêu cầu.
Việc có các request handler tạm thời hoàn toàn cô lập không có trạng thái chia sẻ và không có runtime liên tục tạo ra mô hình lập trình rất sạch sẽ và tốt đẹp.
Một số developer nhấn mạnh tính hữu ích của CGI cho các hệ thống nhúng, công cụ nội bộ doanh nghiệp, và các ứng dụng lưu lượng thấp nơi chi phí của các framework hiện đại không được biện minh. Phương pháp này cũng đơn giản hóa việc triển khai vì các file thực thi mới có thể được thả vào chỗ mà không cần khởi động lại dịch vụ hoặc điều phối phức tạp.
So sánh CGI với Phát triển Web Hiện đại
Ưu điểm của CGI:
- Cách ly tiến trình hoàn toàn cho mỗi yêu cầu
- Tự động dọn dẹp bộ nhớ khi tiến trình kết thúc
- Không có trạng thái chia sẻ giữa các yêu cầu
- Triển khai đơn giản (các tệp thực thi cắm và chạy)
- Không cần quản lý dịch vụ
- Không phụ thuộc vào ngôn ngữ lập trình
Nhược điểm của CGI:
- Chi phí CPU cao hơn do các thao tác fork/exec
- Các vấn đề đồng bộ hóa tiềm ẩn với tài nguyên chia sẻ
- Các mối quan ngại bảo mật truyền thống với việc thực thi document root
- Không phù hợp cho các ứng dụng có lưu lượng truy cập cao
- Bị giới hạn trong mô hình yêu cầu/phản hồi
Các Giải pháp Thay thế Hiện đại:
- FastCGI: Các tiến trình bền vững với giao diện giống CGI
- Reverse proxy với backend HTTP
- Các hàm serverless (mô hình thực thi tương tự)
- Microservices dựa trên container
Thách Thức Kỹ Thuật và Cân Nhắc Bảo Mật
Bài kiểm tra tiết lộ một số vấn đề kỹ thuật vốn có trong các triển khai CGI . Phiên bản Rust chứa lỗi time-of-check-to-time-of-use trong khởi tạo cơ sở dữ liệu, chứng minh cách CGI có thể gây ra các vấn đề đồng bộ hóa trong khi loại bỏ các công cụ đồng bộ hóa truyền thống. Những vấn đề như vậy thường không xảy ra trong các máy chủ ứng dụng liên tục nơi thiết lập cơ sở dữ liệu chỉ xảy ra một lần trong quá trình khởi động.
Các cuộc thảo luận bảo mật tập trung xung quanh danh tiếng lịch sử của CGI so với các tính chất bảo mật thực tế của nó. Trong khi nhiều người liên kết CGI với các lỗ hổng do các script được viết kém từ những năm 1990, bản thân giao thức không kém bảo mật hơn các lựa chọn thay thế hiện đại. Tuy nhiên, thực hành truyền thống đặt các script thực thi trong document root của máy chủ web thực sự tạo ra các vector tấn công tiềm năng, đặc biệt khi kết hợp với các lỗ hổng tải file lên.
Nghiên cứu hiệu suất chứng minh rằng trong khi CGI có thể không phù hợp cho các ứng dụng lưu lượng cao yêu cầu hàng nghìn yêu cầu mỗi giây, nó vẫn là một lựa chọn khả thi cho nhiều tình huống thực tế. Khi các developer tiếp tục tìm kiếm các lựa chọn thay thế cho các web stack hiện đại phức tạp, sự đơn giản và độ tin cậy của CGI khiến nó đáng được xem xét lại cho các trường hợp sử dụng phù hợp.
Tham khảo: Serving a half billion requests per day with Rust + CGI