Quá trình khóa, bỏ qua SIGKILL, có thể chạy được (không phải là zombie hoặc trong giấc ngủ không bị gián đoạn). Nó ở trạng thái nào?


17

Tôi có một quá trình mà nhiều lần bây giờ đã ngừng đáp ứng và dường như bị khóa hoàn toàn. Nó không đáp ứng với bất kỳ nỗ lực nào trong strace hoặc nhìn trộm với gdb (gdb chỉ treo trên một tòa nhà chờ Wait4 ()). Quá trình này có thể chạy được và không phải chờ đợi trên một tòa nhà (/ Proc / X / syscall running:) hoặc trong giấc ngủ không bị gián đoạn (/ Proc / X / status State: R (running):).

Chính xác thì quá trình này là gì? Đây có thể là một lỗi kernel của một số loại?

Quá trình này là redis, và điều này đã xảy ra một vài lần bây giờ. Chỉ có điều có thể giết quá trình là khởi động lại, dường như. HĐH là Cent 7.

Chỉnh sửa: Phiên bản kernel là 3.10.0-123.13.2.el7.x86_64. Hãy thử cập nhật lên 3.10.0-229.11.1.el7 để xem điều đó có khác biệt gì không.


Phiên bản GDB nào đang sử dụng? Theo stackoverflow.com/questions/8978777/, một phiên bản mới hơn có thể hoạt động tốt hơn.
Greg Bray

Hiện tại có vẻ như cuộc điều tra có nhiều hạt nhân hơn vì cách thức đặc biệt mà nó bị treo, nhưng nếu bạn không phiền, bạn có thể thêm một vài thông tin cụ thể của Redis không? Những gì quá trình đang làm trong khi nó chặn và những thứ như vậy. Tôi đã nhận được một vài thông tin từ Nick Craver qua Twitter, rõ ràng Redis đang tải một tập dữ liệu lớn khi điều này xảy ra, là tập dữ liệu được tải chỉ để khởi động lại quá trình hoặc theo một cách khác (ví dụ qua DEBUG RELOAD hoặc lấy một lượng lớn dữ liệu )? Cảm ơn.

@antirez Tập dữ liệu đang được tải bởi một bản sao rdb từ một phiên bản redis khác. Việc khóa máy xảy ra sau khi redis khởi động và đọc trong rdb khổng lồ. Đáng chú ý là đôi khi nó không bị khóa trong lúc này.
alienth

1
Tôi chỉ có loại vấn đề này khi có lỗi IO. Bạn có thể vui lòng cho chúng tôi biết về dmesgđầu ra?
Ho1

3
Không /proc/<pid>/stack(và /proc/<pid>/task/*/stack) chứa gì? Quá trình đó có một số chủ đề?
Stéphane Chazelas

Câu trả lời:


2

Wait4 là một tòa nhà cao tầng cho thấy quá trình đang chờ một trong những đứa con của anh ta chấm dứt. Điều này có thể chỉ ra một số vấn đề với việc xử lý tín hiệu.

Một chút tàn bạo, nhưng bạn có thể cố gắng giết cấu trúc phân cấp của ứng dụng : kill -15 -$YourRedisPID. Các - trước khi phương tiện PID "PID và con của nó". Vì nó dường như đang chờ chấm dứt trẻ em, nó có thể mở khóa nó.

Nếu nó không hoạt động, hãy kiểm tra sâu hơn: tìm trạng thái quá trình tín hiệu của bạn với grep ^Sig /proc/$YourRedisPID/status

Bạn sẽ thấy một số thứ như:

SigQ:   8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023

Như được định nghĩa trong "fs / Proc / Array.c" của nguồn kernel, "SigQ" là số tín hiệu đang chờ xử lý / giới hạn của tín hiệu đang chờ xử lý.

Nếu số lượng tín hiệu quá cao, nó có thể cho thấy "SIGKILL" của bạn hoàn toàn không được xử lý. Tôi vẫn đang kiểm tra tệp "kernel / signal.c" để hiểu cách quản lý tín hiệu của các tín hiệu đặc biệt này.

Để hiểu trực tiếp về đầu ra, hãy thử một lớp lót này: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

Điều này cho tôi kết quả:

0
0
10000000
110000000000000000100000000100011

Hãy bắt đầu bằng cách gửi cho chúng tôi đầu ra này. Tôi sẽ cập nhật bài viết theo yêu cầu.


Quá trình không nằm trong Wait4 (), gdb được treo trên Wait4 () khi cố gắng truy cập tiến trình. Quá trình tự nó không có trong bất kỳ tòa nhà. Ngoài ra, quá trình hung không có con. Thật không may, tôi đã phải khởi động lại hộp. Tôi sẽ thu thập dữ liệu bạn yêu cầu khi sự cố xảy ra.
alienth

Đầu ra ở đây: gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/ gợi Một lần nữa, Proc lại bỏ qua SIGKILL. Nó không ở trong một tòa nhà cao tầng. Proc cũng bỏ qua SIGTERM.
alienth
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.