2012-10-24 66 views
7

Tôi gặp sự cố trong đó máy chủ của tôi bắt đầu không thực hiện một số quy trình và kiểm tra thông thường bởi vì bộ nhớ của máy chủ đã hoàn toàn đầy và được thực hiện.Lịch sử sử dụng bộ nhớ Linux

Tôi đã xem lịch sử ghi nhật ký và thấy rằng nó đã bị giết là một số quy trình Java.

Tôi đã sử dụng lệnh "trên cùng" để xem quy trình nào đang chiếm nhiều bộ nhớ nhất ngay bây giờ (sau khi sự cố đã được khắc phục) và đó là một quá trình Java. Vì vậy, về bản chất, tôi có thể nói những gì các quá trình đang chiếm bộ nhớ nhất ngay bây giờ.

Điều tôi muốn biết là có cách nào để xem quy trình nào đang chiếm nhiều bộ nhớ nhất vào thời điểm xảy ra lỗi không? Có lẽ Linux theo dõi hoặc đăng nhập sử dụng bộ nhớ vào những thời điểm cụ thể? Tôi thực sự không có ý tưởng nhưng nó sẽ là tuyệt vời nếu tôi có thể thấy rằng loại chi tiết.

Trả lời

2

Bạn có nói rằng trình diệt OOM hạt nhân đã tắt không? Đăng nhập trong dmesg nói gì? Lưu ý rằng bạn có thể hạn chế một JVM để sử dụng một kích thước heap cố định, có nghĩa là nó sẽ thất bại một cách chắc chắn khi đầy đủ thay vì để hạt nhân giết cái gì đó khác. Nhưng câu trả lời chung cho câu hỏi của bạn là không: không có cách nào để chạy một cách đáng tin cậy bất cứ điều gì tại thời điểm xảy ra lỗi OOM, vì hệ thống hết bộ nhớ! Tốt nhất, bạn có thể sử dụng một quy trình riêng để thăm dò bảng quy trình và kích thước quy trình đăng nhập để bắt các điều kiện rò rỉ bộ nhớ, v.v.

+0

FWIW, bạn có thể sử dụng mlockall() hoặc tương tự để thực hiện một quá trình tương đối đáng tin cậy trong một khủng hoảng bộ nhớ. EG: http://stromberg.dnsalias.org/~strombrg/fallback-reboot/ – user1277476

+0

Đó là sự thật chỉ cho các ứng dụng rất hạn chế. Thực hiện bất kỳ cuộc gọi hệ thống nào đều có khả năng thất bại do lỗi phân bổ trong hạt nhân. Việc sinh ra các quy trình bên ngoài là ngoài câu hỏi. I/O hệ thống tập tin có khả năng treo vô thời hạn do cạn kiệt bộ đệm. Đúng là nó không phải là không thể, nhưng nó phải được thực hiện với sự chăm sóc đặc biệt. –

3

@Andy đã trả lời câu hỏi của bạn. Tuy nhiên, tôi muốn thêm rằng để tham khảo trong tương lai sử dụng một công cụ giám sát. Một cái gì đó như these. Những điều này sẽ cung cấp cho bạn những gì đã xảy ra trong một vụ tai nạn vì bạn rõ ràng không thể giám sát tất cả các máy chủ của bạn mọi lúc. Hy vọng nó giúp.

0

Không có lịch sử sử dụng bộ nhớ trong linux được mặc định, nhưng bạn có thể đạt được nó bằng một số công cụ dòng lệnh đơn giản như sar.

Về vấn đề của bạn với bộ nhớ: Nếu nó là kẻ giết người OOM đã làm một số lộn xộn trên máy, thì bạn có một tùy chọn tuyệt vời để đảm bảo nó sẽ không xảy ra nữa (tất nhiên sau khi giảm kích thước heap JVM).

Theo hạt nhân Linux mặc định phân bổ nhiều bộ nhớ hơn thực tế. Điều này, trong một số trường hợp, có thể dẫn đến OOM-killer giết chết quá trình tiêu thụ bộ nhớ nhiều nhất nếu không có bộ nhớ cho các nhiệm vụ hạt nhân. Hành vi này được kiểm soát bởi tham số vm.overcommit sysctl.

Vì vậy, bạn có thể thử đặt thành vm.overcommit = 2sysctl.conf và sau đó chạy sysctl -p.

Điều này sẽ cấm quá mức và khiến khả năng OOM-killer làm những điều khó chịu rất thấp. Ngoài ra, bạn có thể suy nghĩ về việc thêm một chút không gian hoán đổi (nếu bạn chưa có nó) và đặt vm.swappiness thành một số giá trị thực sự thấp (ví dụ như 5, giá trị mặc định là 60), vì vậy trong quy trình làm việc bình thường, ứng dụng của bạn sẽ không đi vào trao đổi, nhưng nếu bạn sẽ thực sự ngắn về bộ nhớ, nó sẽ bắt đầu sử dụng nó tạm thời và bạn sẽ có thể nhìn thấy nó ngay cả với df

CẢNH BÁO này có thể dẫn đến quá trình nhận "có thể không cấp phát bộ nhớ "nếu bạn có máy chủ của bạn bị quá tải bởi bộ nhớ.Trong trường hợp này:

  1. Cố gắng hạn chế sử dụng bộ nhớ của các ứng dụng
  2. Move phần trong số họ để máy khác
Các vấn đề liên quan