CoreOS: tcpdump giải quyết vấn đề mạng một cách bí ẩn (số lượng ổ cắm quá mức được sử dụng)


14

Tôi đã có một bí ẩn cho bạn ngày hôm nay. Chúng tôi chạy một cụm Elaticsearch nhỏ, ba nút dựa trên CoreOS (2023.5.0 / Linux 4.19.25-coreos) trên Azure. Elaticsearch được chạy bên trong một container docker ở chế độ mạng máy chủ. Sau khi chạy gần như hoàn toàn bảo trì miễn phí trong hơn một năm, chúng tôi đã thấy máy móc rơi vào trạng thái rất thú vị.

Cập nhật

Vấn đề này đã được giải quyết bằng cách sửa lỗi trình điều khiển trong nhân Linux . Xem câu trả lời dưới đây.

Triệu chứng

Về cơ bản, mạng giữa máy bị ảnh hưởng và hai nút còn lại sẽ chết. Tất cả đều nằm trong cùng một mạng ảo và cùng một mạng con và có thể giao tiếp với nhau một cách hữu ích. Nút bị ảnh hưởng vẫn có thể được truy cập từ các mạng con khác (tôi có thể ssh vào nó) và từ một mạng ảo ngang hàng khác. Máy cũng có kết nối (rất đốm) với Internet, nhưng hầu hết các yêu cầu chỉ hết thời gian.

Chúng tôi đã quan sát thấy rằng trên một nút bị ảnh hưởng, số lượng "socket được sử dụng" được báo cáo /proc/net/sockstatlà rất cao (~ 4,5k thay vì ~ 300 trên một nút khỏe mạnh). Theo dõi cho thấy con số này tăng lên nhanh chóng kể từ thời điểm nút không khả dụng.

Điều thú vị là dường như chúng ta không thể xác định được nguồn gốc của các ổ cắm được sử dụng này:

# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse 0 memory 0

Khác hơn là máy có vẻ tốt. Không có quá trình đáng ngờ nào đang chạy, việc sử dụng CPU là tối thiểu và có rất nhiều bộ nhớ khả dụng.

Ping một VM "không thể truy cập" trong cùng một mạng con dẫn đến một vài EAGAINphản hồi recvmsgvà sau đó chuyển qua để lấy ENOBUFSlại từ đó sendmsg. đầu ra ping ở đây

Tôi đã thu thập một số đầu ra bổ sung (trước khi bất kỳ sửa đổi nào đối với hệ thống được thực hiện) và đăng nó trong ý chính này: https://gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c

Phân tích

Chúng tôi đã cố gắng tắt tất cả mọi thứ chúng tôi có thể nghĩ trên máy chủ, với elaticsearch là nghi phạm đầu tiên. Nhưng việc tắt các thùng chứa elaticsearch không giải phóng các ổ cắm đã sử dụng. Điều tương tự cho tất cả các quy trình liên quan đến CoreOS (update-engine, lockmithd, ...) hoặc thậm chí toàn bộ thời gian chạy Docker hoặc công cụ dành riêng cho Azure. Dường như không có gì để giúp đỡ.

Nhưng bây giờ nó thậm chí còn kỳ lạ hơn: Chúng tôi đã cố gắng chạy tcpdumptrên máy để xem những gì đang xảy ra. Và kìa: Vấn đề tự giải quyết, kết nối đã được khôi phục. Lý thuyết của chúng tôi là tcpdump thực hiện một số kiểu nhà chọc trời giải quyết nó. Chúng tôi đã chạy tcpdump với gdb và đặt các điểm dừng trên tất cả các tòa nhà. Sau khi bước qua vô số điểm dừng, cuối cùng chúng tôi thấy rằng hành động thiết lập chế độ lăng nhăng trên ổ cắm (cụ thể là dòng này trong libpcap ) là điều đặt lại ổ cắm được sử dụng và đưa chúng tôi trở lại trạng thái bình thường.

Kết quả bổ sung

  • Chúng tôi đã xác minh rằng việc chạy tcpdumpvới -p/--no-promiscuous-modecờ không xóa các ổ cắm được sử dụng và đưa máy về trạng thái có thể sử dụng được.
  • Chạy ifconfig eth0 txqueuelen 1001đặt lại các ổ cắm được sử dụng bộ đếm nhưng kết nối không được khôi phục.
  • Cài đặt chế độ lăng kính bằng tay ip link set eth0 promisc oncũng không khôi phục kết nối.
    • net.ipv4.xfrm4_gc_thresh được đặt thành 32768 và tăng lên một chút không giải quyết được vấn đề.

ổ cắm được sử dụng

Chúng tôi đã liên hệ với Azure, những người gặp khó khăn như chúng tôi. Tôi hiểu rằng đây có thể không phải là vấn đề mà chỉ là một triệu chứng. Nhưng nó là thứ hữu hình duy nhất mà tôi tìm thấy cho đến nay. Hy vọng của tôi là bằng cách hiểu các triệu chứng tôi có thể đến gần hơn với nguyên nhân gốc rễ. Các giao diện mạng trên Azure được chạy với trình điều khiển mạng này .

Có lẽ CoreOS / Kernel là đáng trách?

Từ quan điểm dòng thời gian, các vấn đề bắt đầu vào 2019-03-11, đó là ngày mà CoreOS tự động cập nhật lên phiên bản mới nhất. Theo ghi chú phát hành , bản cập nhật này chứa bản cập nhật kernel từ 4.15.23 đến 4.19.25 . Tôi vẫn đang đi qua các thay đổi để xem liệu có bất cứ điều gì có thể là một vấn đề ở đó không. Cho đến nay tôi chỉ phát hiện ra rằng trình điều khiển mạng hyperv đã nhận được khá nhiều cập nhật trong những tháng gần đây , không phải tất cả trong số đó dường như là một phần của 4.19.25. Bản vá mà CoreOS áp dụng cho 4.19.25 không ấn tượng lắm , nhưng bản vá giới thiệu mô-đun nf_conntrack_ipv4 giả là mới.

Cập nhật: Có thể liên quan đến bản vá kernel đến?

Cứu giúp!

Cho đến nay, các câu hỏi chúng tôi có như sau:

  • Điều gì có thể khiến số liệu "ổ cắm được sử dụng" này tăng vọt? Tôi đã đọc qua các nguồn nhân cho số liệu này và dường như nó chỉ là một bộ đếm không có tham chiếu đến loại ổ cắm nào thực sự là gì hoặc cái gì đã tạo ra chúng.

  • Tại sao số căn hộ ở khoảng 4,5k? Giới hạn nào sẽ gây ra điều này?

  • Có điều gì đó thay đổi đáng kể giữa kernel 4.14.96 và 4.19.25 không?

  • Tại sao setsockopt()cuộc gọi trong libpcap đặt lại trạng thái?

Lỗi CoreOS liên quan: https://github.com/coreos/bugs/issues/2572


Các ổ cắm mở là một vấn đề kết quả, không phải vấn đề gốc IMHO. Tôi đã có hành vi này trên một hệ thống linux với các thiết bị macvlan (có địa chỉ mac của riêng họ) trên một thiết bị cầu nối. Đặt cầu nối để làm cho các thiết bị macvlan hoạt động. Tôi không biết coreos hay azure. Vấn đề là một lớp bên dưới không biết về các địa chỉ mac ở các cấp cao hơn.
AndreasM

Cảm ơn bình luận của bạn! Tôi nhận ra rằng một số lượng lớn các ổ cắm được sử dụng không phải là nguyên nhân gốc rễ, tôi chỉ bám vào một thứ hữu hình mà tôi có thể xác định là bất thường trên máy.
Stephan Klein

Xin chào Stephan. Có tin gì không? vui lòng báo cáo 1) có bật WOL không? 2) sysctl -w net.ipv4.route.flush = 1 có giải quyết không? 3) bộ đệm arp ở trạng thái không hoạt động là gì? ở trạng thái làm việc?
Massimo

Câu trả lời:


4

Trước hết, cảm ơn bạn cho câu hỏi bằng văn bản rất tốt!

Vì mức độ chi tiết bạn mô tả là rất cao và bạn đã ở mức gdb, tôi cho rằng câu trả lời của tôi sẽ không được sử dụng nhiều cho bạn. Dù sao, đây là một thử:

  • Có lẽ bạn đã thử một cái gì đó như ss -aelsof -n?
  • dmesgtrả lại bất cứ điều gì thú vị khi điều này xảy ra?
  • Bạn có sử dụng iptables trên máy chủ không?
  • Nếu bạn đặt chế độ lăng nhăng bằng một số cách khác ngoài tcpdump (giả sử ip link set [interface] promisc on), điều này cũng khắc phục được sự cố?
  • Bạn đã kiểm tra bất kỳ quá trình đáng ngờ, tập tin hoặc hoạt động kỳ lạ khác? Chỉ cần nghĩ rằng có thể một số quá trình khó chịu không được mời đang ẩn nấp trong bóng tối và tự im lặng bất cứ khi nào chế độ lăng nhăng được thiết lập?
  • Nếu bạn để tcpdump chạy nền, vấn đề này có trở lại không?

Tôi hi vọng cái này giúp được.


1
Cảm ơn bạn đã trả lời của bạn! Tôi thực sự đã thu thập đầu ra của một số lệnh mà bạn tham khảo. Bây giờ chúng cũng được liên kết trong câu hỏi ( gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c ). Điều lạ là get cách ít ổ cắm được báo cáo từ ss, lsofnetstathơn từ "ổ cắm sử dụng" trong /proc/net/sockstat. Chỉ có tổng số (dường như chỉ đọc từ tệp đó) là như nhau. iptableschạy nhưng không có quy tắc đặc biệt (xem ý chính), tôi đã không thử tự thiết lập chế độ lăng nhăng hoặc chạy tcpdump liên tục. Sẽ làm điều đó lần sau.
Stephan Klein

Tôi đã thêm đầu ra của ss -aepibộ sưu tập đầu ra của mình: gist.github.com/privatwolke/ Khăn - Đáng buồn là dmesg trả lại chính xác không có gì khi điều này xảy ra. Trên thực tế, mục mới nhất trước khi xảy ra sự cố là 5 ngày.
Stephan Klein

Đã thêm dmesg / journalctl -kđầu ra.
Stephan Klein

Tôi đã xác minh rằng ip link set eth0 promisc onmột mình không khôi phục máy về trạng thái có thể sử dụng.
Stephan Klein

Xin chào, bạn đã xem qua câu hỏi khác trong trang web này chưa? serverfault.com/questions/614453/ Từ Nó dường như ngụ ý rằng bạn có thể đang làm cạn bộ nhớ cache xfrm4. Bạn có thể tăng nó với cài đặt kernel này: xfrm4_gc_thresh - INTEGER The threshold at which we will start garbage collecting for IPv4 destination cache entries. At twice this value the system will refuse new allocations. Theo như tôi có thể nói nó liên quan đến IPsec, mặc dù bạn dường như không chạy ở đây.
Pedro Perez

0

Điều này được gây ra bởi một lỗi trong trình điều khiển hv_netsvc trong nhân Linux. Chúng tôi có thể giải quyết vấn đề này với nhà phát triển Microsoft và quản lý để sửa lỗi được áp dụng ngược dòng.

Tôi sẽ trích dẫn thông điệp cam kết ở đây vì nó giải quyết vấn đề khá tốt:

Khi bộ đệm vòng gần đầy do thông báo hoàn thành RX, gói TX có thể chạm đến "hình mờ thấp" và khiến hàng đợi bị dừng. Nếu hoàn thành TX đến sớm hơn dừng hàng đợi, việc đánh thức có thể bị bỏ lỡ.

Bản vá này di chuyển kiểm tra gói chờ xử lý cuối cùng để bao gồm cả trường hợp EAGAIN và thành công, do đó hàng đợi sẽ được đánh thức một cách đáng tin cậy khi cần thiết.

Để tham khảo trong tương lai, cam kết sửa lỗi này là https://github.com/torvalds/linux/commit/6d9cfab853ca60b2f77b5e4c40443216988cba1f .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.