Tôi đang sử dụng IIS trên Windows Server 2016 với MySQL và PHP trên hai máy chủ gần như giống hệt nhau. Gần đây, tôi đã nhận thấy một trong hai máy chủ của mình bị chậm lại nhưng điều đó chỉ xảy ra khi trang web của tôi cố gắng thực thi nhiều phiên bản của một tập lệnh cùng một lúc. Họ dường như bị mắc kẹt vào nhau.
Một ví dụ hoàn hảo là trang tìm kiếm của tôi. Khi người dùng nhập truy vấn tìm kiếm, với mỗi lần nhập phím (sau chữ cái thứ hai), một tìm kiếm được thực hiện miễn là có độ trễ ít nhất 200 mili giây kể từ lần nhấn phím cuối cùng. Vì vậy, nếu bạn gõ nhanh, nó chỉ thực hiện một tìm kiếm ở cuối nhưng đối với những người gõ chậm hơn (những người đợi hơn 200 mili giây giữa các lần nhấn phím), điều này sẽ kích hoạt nhiều cuộc gọi đến kết quả tìm kiếm. Xem ảnh chụp màn hình này.
MÁY CHỦ XẤU
Lưu ý tất cả các yêu cầu đang chờ xử lý và trong ảnh chụp màn hình này, yêu cầu đầu tiên vừa hoàn thành sau 19,08 giây. Rõ ràng là quá lâu. Vào thời điểm họ hoàn thành tất cả, họ sẽ mất hơn 15 giây để trả về một tập kết quả đơn giản.
MÁY CHỦ XẤU
Hãy nhớ rằng các truy vấn này chỉ mất một phần giây khi chạy trong MySQL Workbench và cả khi chạy trên máy chủ khác của tôi không gặp sự cố này. Xem trong ảnh chụp màn hình này (từ máy chủ tốt), cùng một tìm kiếm trả về sau một phần tư giây.
MÁY CHỦ TỐT
Đối với tôi, có vẻ như (trên máy chủ xấu) vì một số lý do, chúng không thể thực hiện đồng thời vì nếu tôi chỉ thực hiện một tìm kiếm (bằng cách nhập đủ nhanh để chỉ kích hoạt một tìm kiếm) thì nó sẽ quay lại nhanh, nhưng nếu tôi thực hiện bội số như thế này, tất cả đều bị kẹt như tắc đường. Điều gì có thể gây ra điều này?
Ảnh chụp màn hình tiếp theo này hiển thị kết quả nếu tôi chỉ kích hoạt một tìm kiếm duy nhất trên máy chủ xấu. Như bạn có thể thấy nó trở lại siêu nhanh. Vì vậy, vấn đề chỉ xảy ra khi thực thi đồng thời nhiều tập lệnh giống nhau.
MÁY CHỦ XẤU
Gần đây, tôi đã thực hiện một số thay đổi đối với máy chủ bị lỗi nhưng theo những gì tôi có thể nhớ, thay đổi duy nhất tôi đã thực hiện là cho phép tải lên tệp lớn hơn.
- Trong PHP tôi đã tăng post_max_size = 500M
- Trong PHP tôi đã tăng upload_max_filesize = 500M
- Trong IIS, tôi đã tăng UploadReadAheadSize lên 49152000
- Trong IIS, tôi đã tăng độ dài nội dung tối đa được phép lên 300000000
Có thể tôi đã thực hiện các thay đổi khác đối với máy chủ này mà tôi không thể nhớ được.
KHẮC PHỤC TẠM THỜI
Tôi có thể giảm thiểu vấn đề này bằng cách cho phép độ trễ lâu hơn giữa các lần nhấn phím khi tìm kiếm và tôi đã làm được điều này, tăng nó lên 800 mili giây để ngay cả những người gõ chậm cũng không thấy vấn đề này, nhưng đây chỉ là một giải pháp hỗ trợ ban nhạc và không giải quyết vấn đề tiềm ẩn cũng ảnh hưởng đến các khu vực khác trên trang web của tôi.
NHỮNG GÌ TÔI ĐÃ THỬ
Cho đến nay tôi đã xác nhận rằng cấu hình IIS, cấu hình MySQL (my.ini) và cấu hình PHP (php.ini) của tôi đều giống nhau theo mọi cách quan trọng trên cả hai máy chủ (ít nhất là theo những gì tôi thấy rõ ràng) . Tôi cũng đã xác nhận rằng các câu lệnh chọn mà tôi đang chạy trong tìm kiếm này hoạt động tốt như nhau trên cả hai máy chủ nếu tôi thực thi chúng trong MySQL Workbench. Chỉ trong ứng dụng web của tôi, nơi tôi gặp sự cố này.
Tôi tạm thời hủy bỏ hai thay đổi mà tôi đã thực hiện đối với IIS để tải lên tệp lớn hơn đề phòng, nhưng điều đó dường như không tạo ra sự khác biệt nào.
Tôi cũng đã tải xuống và cài đặt LeanSentry, nó cảnh báo tôi một hoặc hai lần mỗi ngày rằng trang web của tôi đã thấy các yêu cầu bị chặn, mà tôi cho rằng đó chính xác là những gì tôi đang thấy ở đây, nhưng thật không may, LeanSentry chỉ có thể xác định nguồn gốc của vấn đề với ASP trang, không phải PHP. Vì vậy, về cơ bản, nó chỉ xác nhận với tôi rằng có vấn đề nhưng nó không thể giúp tôi vượt qua điều đó.
CÁC TRIỆU CHỨNG KHÁC
Tôi gặp các sự cố tương tự nếu tôi mở đồng thời nhiều báo cáo. Nếu tôi cho phép một báo cáo tải xong trước khi mở báo cáo tiếp theo thì tất cả chúng đều tải nhanh, nhưng nếu tôi buộc ứng dụng của mình mở nhiều báo cáo cùng một lúc, thì tất cả chúng đều bị kẹt.
Điều gì có thể gây ra vấn đề thắt cổ chai này?