Liên tục tăng kích thước trao đổi trong Linux và không gian hoán đổi không được thu hồi?


10

Tôi có một hộp linux RAM 8GB trên đó có 4 máy chủ tomcat đang chạy. Một trong số chúng được đặt thành bộ nhớ 3000MB (cài đặt jvm -Xms và -Xmx) và các bộ nhớ khác được đặt thành 1500 MB. Phân vùng trao đổi cũng được đặt thành 8Gigs. Khi tôi khởi động các máy chủ này, việc sử dụng tệp trao đổi thấp. Nhưng trong một khoảng thời gian ngày và trong một số thời điểm nhất định khi một / tất cả các máy chủ đang hoạt động cao điểm, việc sử dụng trao đổi bắt đầu tăng lên. Đây là một đầu ra sar -r điển hình.

kbmemfree kbmemuse% đã sử dụng kbbuffers kbcached kbswpfree kbswpuse % swpuse kbswpcad

48260 8125832 99,41 196440 2761852 7197688 1190912 14.20 316044

75504 8098588 99,08 198032 2399460 7197688 1190912 14.20 316032

Nó cho thấy 14,2% trao đổi được sử dụng hiện tại. Điều buồn cười là% KHÔNG BAO GIỜ này giảm . Nó tiếp tục tăng và đạt tới 30-40% . Chúng tôi khởi động lại máy chủ của chúng tôi hàng tuần.

Tôi sẽ giả sử % swpuse tăng trong thời gian hoạt động cao điểm và giảm trong thời gian hoạt động thấp..Hoặc ít nhất là không đổi. Điều này có vẻ như không gian hoán đổi không bao giờ được hệ điều hành thu hồi ..

Đầu ra miễn phí: miễn phí -m tổng số bộ đệm chia sẻ miễn phí được sử dụng được lưu trong bộ nhớ cache Mem: 7982 7937 45 0 32 2088 - / + bộ đệm / bộ đệm: 5816 2166 Hoán đổi: 8191 1163 7028

Vì vậy, có ít nhất 2g Ram miễn phí. Vì vậy, câu hỏi là tại sao không gian hoán đổi tiếp tục tăng và không được HĐH thu hồi? Hoặc làm thế nào để gỡ lỗi này để tìm ra những gì đang xảy ra ..

Câu trả lời:


12

Nếu thông tin được hoán đổi ra đĩa và sau đó đọc lại vào bộ nhớ, nó sẽ thường được phân bổ trong vùng trao đổi cho đến khi không gian trao đổi sắp hết. Điều đó có nghĩa là nếu thông tin tương tự cần được hoán đổi lại sau đó và không thay đổi, HĐH chỉ có thể thả các trang khỏi RAM được phân bổ mà không cần ghi bất cứ điều gì vào đĩa tiết kiệm thời gian.

Hoán đổi được phân bổ cho những thứ đã được đọc trở lại vào bộ nhớ sẽ được giải phóng

  1. khi các trang có liên quan không còn cần thiết nữa (nghĩa là được giải phóng bởi ứng dụng)
  2. khi các trang có liên quan được thay đổi (vì vậy bản sao trên đĩa không còn cập nhật nữa)
  3. Máy sắp hết dung lượng trao đổi, vì vậy hãy xóa một số thứ đã có trong RAM để nhường chỗ

Tìm kiếm /proc/meminfomột dòng gọi là "SwapCached". Mục này đếm các trang được tìm thấy cả trong RAM và trong phân vùng trao đổi. Chẳng hạn, chọn một VM nhỏ một cách ngẫu nhiên, /proc/meminfotệp ảo mà một trong các VM của tôi hiển thị:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

chỉ ra rằng 74268K không gian hoán đổi được phân bổ, nhưng các trang đó trị giá 17 232K cũng hiện được ánh xạ vào RAM (do đó có thể được giải phóng khỏi trao đổi tại một thời điểm nếu không cần một khoảng trống nào khác).

Ngoài ra, không còn nghi ngờ gì nữa, các trang ngồi ở đó đã được hoán đổi từ lâu và chưa bao giờ được sử dụng lại kể từ đó. Hạt nhân sẽ không tải lại các trang từ trao đổi chỉ vì có một số RAM miễn phí để đọc lại vì RAM miễn phí có thể được sử dụng tốt hơn cho bộ đệm hoặc bộ đệm - các trang được viết để trao đổi thường chỉ đọc lại khi cần tiếp theo.

Nếu bạn muốn xóa những gì đang trao đổi, miễn là bạn có đủ bộ đệm miễn phí và / hoặc có thể tự do (tức là bộ đệm + bộ nhớ cache + miễn phí (trừ những phần của số c + b không thể giải phóng được Right ThisInstant)), chỉ cần xoay nó tắt và trở lại một lần nữa với swapoff -a && swapon -a.

Tất nhiên bạn cũng có thể bị rò rỉ bộ nhớ ở đâu đó, nhưng đó không phải là lời giải thích duy nhất cho hành vi bạn đang thấy.


Câu trả lời tuyệt vời. Cảm ơn. Vì vậy, hệ thống của tôi hiện đang hiển thị SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB So Swap thực tế miễn phí = 7197688 + 595724 = 7793412. Actul Swap được sử dụng = 8388600 - 7793412 = 5 Tôi đoán 581 MB sử dụng tệp hoán đổi là hợp lý cho hệ thống 8GB có 4 ứng dụng đang chạy. Hãy để tôi theo dõi điều này trong vài ngày tới và xem liệu con số hoán đổi có tiếp tục tăng tỷ lệ thuận với% exchangeUsed không.
Zenil

2

Về cơ bản, bạn không cần phải quan tâm về điều này. Điều quan trọng cần biết là có bao nhiêu IO chuyển đến trao đổi (hãy xem lệnh 'vmstat'). Có nhiều thứ trong trao đổi không mất gì. Chi phí duy nhất là đưa công cụ vào trao đổi (trang vào) hoặc lấy nó ra (trang ra). Vì vậy, hoàn toàn hợp lý khi HĐH cho phép hoán đổi phát triển.


1
Điều quan trọng là phải biết tại sao trao đổi tăng trưởng và không bao giờ giảm .. Điều gì sẽ xảy ra nếu chúng ta cho phép các máy chủ của mình tiếp tục chạy trong nhiều tuần? Trao đổi sẽ phát triển vượt quá giới hạn và dẫn đến các vấn đề bộ nhớ? Các chàng swapin / swapout "hợp lý" .. Trong giai đoạn hoạt động cao điểm có swapin cao / swapout (và tăng cũng% swapused) .. Trong thời gian bình thường swapin / swapout là tối thiểu nhưng% swapused không giảm
Zenil

0

miễn là bạn có không gian hoán đổi có sẵn, không cần os để giải phóng không gian. Nó sẽ được giải phóng khi không còn chỗ trống. Bu khi bạn gặp tình huống này chắc chắn bạn có vấn đề.


0

Không có cách nào để biết liệu điều này cuối cùng sẽ trở thành một vấn đề trừ khi bạn chạy một máy chủ đủ lâu để xem liệu nó có trở thành một vấn đề hay không.

Về cơ bản, HĐH sẽ trao đổi những thứ không được sử dụng để giữ bộ nhớ trống mọi lúc, trong trường hợp một chương trình mới được bắt đầu. Không gian hoán đổi sẽ không được giải phóng cho đến khi cần, có nghĩa là bạn có thể sử dụng 100% không gian hoán đổi và không có vấn đề về hiệu suất. Điều đáng lo ngại là nếu điều này được gây ra bởi rò rỉ bộ nhớ. Nó không nhất thiết là rò rỉ bộ nhớ nhưng có thể.

Java không dễ bị rò rỉ bộ nhớ, nhưng nó có thể xảy ra với các ứng dụng phức tạp.

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.