Nếu một máy khách kết nối với MySQL-Server, nó thường mở một cổng cục bộ, ví dụ:
localhost:12345 -> mysqlserver:3306
Nếu máy khách đóng kết nối, máy khách sẽ nhận được TIME_WAIT. Do định tuyến TCP, một gói có thể đến muộn trên cổng tạm thời. Một kết nối trong TIME_WAIT chỉ hủy các gói này. Nếu không có TIME_WAIT, cổng cục bộ có thể được sử dụng lại cho một kết nối khác và có thể nhận các gói từ một kết nối cũ.
Trên một ứng dụng có tần suất cao trên web mở kết nối mysql cho mỗi yêu cầu, số lượng kết nối TIME_WAIT cao là điều có thể xảy ra. Không có gì sai với nó.
Sự cố có thể xảy ra nếu phạm vi cổng cục bộ của bạn quá thấp, vì vậy bạn không thể mở các kết nối đi nữa. Thời gian chờ thông thường được đặt thành 60 giây. Vì vậy, sự cố có thể đã xảy ra với hơn 400 yêu cầu mỗi giây ở phạm vi thấp.
Kiểm tra:
Để kiểm tra lượng TIME_WAIT, bạn có thể sử dụng lệnh sau:
$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
Giá trị sau "tw", trong trường hợp này là 33365, hiển thị số lượng TIME_WAIT.
Giải pháp:
một. Điều chỉnh TIME_WAIT (Ví dụ về hệ điều hành dựa trên Linux):
Giảm thời gian chờ cho TIME_WAIT:
# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
Tăng phạm vi cổng cho các cổng cục bộ:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Cài đặt /proc/sys/net/ipv4/tcp_tw_recycle
và /proc/sys/net/ipv4/tcp_tw_reuse
cũng có thể thú vị. (Nhưng chúng tôi đã gặp phải các tác dụng phụ kỳ lạ với các cài đặt này, vì vậy tốt hơn nên tránh chúng. Thông tin thêm trong này answer
)
b. Kết nối liên tục
Một số ngôn ngữ lập trình và thư viện hỗ trợ kết nối liên tục. Một giải pháp khác có thể là sử dụng proxy được cài đặt cục bộ như "ProxySQL". Điều này làm giảm số lượng kết nối mới và kết nối đã đóng.