it-swarm-vi.tech

Kích thước bộ nhớ ảo trong top có nghĩa là gì?

Tôi đang chạy top để theo dõi hiệu suất máy chủ của tôi và 2 trong số các quy trình Java của tôi hiển thị bộ nhớ ảo lên tới 800MB-1GB. Đó có phải là điều xấu không?

Bộ nhớ ảo có nghĩa là gì?

Và oh btw, tôi đã trao đổi 1GB và nó hiển thị 0% được sử dụng. Thế là tôi bối rối.

Quá trình Java = 1 máy chủ Tomcat + của riêng tôi Java daemon Server = Ubuntu 9.10 (karmic)

129
kapso

Bộ nhớ ảo thậm chí không nhất thiết là bộ nhớ. Ví dụ: nếu bộ nhớ quy trình ánh xạ một tệp lớn, tệp thực sự được lưu trữ trên đĩa, nhưng nó vẫn chiếm "không gian địa chỉ" trong quy trình.

Không gian địa chỉ (ví dụ: bộ nhớ ảo trong danh sách quy trình) không tốn bất kỳ chi phí nào; nó không có thật Cột RSS (RES) thực sự là bộ nhớ thường trú. Đó là bao nhiêu bộ nhớ thực của bạn mà một quá trình đang chiếm giữ.

Nhưng ngay cả đó không phải là toàn bộ câu trả lời. Nếu một quá trình gọi fork (), nó sẽ chia thành hai phần và cả hai ban đầu đều chia sẻ tất cả RSS của họ. Vì vậy, ngay cả khi RSS ban đầu là 1 GB, kết quả sau khi chuyển đổi sẽ là hai quá trình, mỗi quy trình có RSS là 1 GB, nhưng bạn vẫn chỉ được sử dụng 1 GB bộ nhớ.

Bối rối chưa? Đây là những gì bạn thực sự cần biết: sử dụng lệnh free và kiểm tra kết quả trước và sau khi bắt đầu chương trình của bạn (trên +/- buffers/cache hàng). Sự khác biệt đó là bao nhiêu mới bộ nhớ chương trình mới bắt đầu của bạn được sử dụng.

147
apenwarr

Từ trang đầu (1) man:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Trong đó RES có nghĩa là bộ nhớ RESident (bộ nhớ vật lý được sử dụng).

Thật ra điều đó không đúng (nữa). Khi nó nói "hoán đổi", cũng bao gồm các tệp mà chương trình đã ánh xạ vào không gian địa chỉ của nó, có thể thực sự không tiêu thụ thực sự RAM. Bộ nhớ này được hỗ trợ tệp nhưng không phải là tệp 'T thực sự trao đổi.

VIRT cũng bao gồm các trang đã được phân bổ nhưng chưa được sử dụng cho bất cứ điều gì. Bất kỳ trang nào trong trạng thái này được ánh xạ tới kernel Zero Page (khái niệm tuyệt vời - bạn nên tìm kiếm nó) để nó hiển thị trong VIRT nhưng thực sự không tiêu tốn bất kỳ bộ nhớ nào.

24
amphetamachine

Tôi tìm thấy cái này lời giải thích từ Mugurel Sumanari rất rõ ràng:

VIRT là viết tắt của kích thước ảo của một tiến trình, là tổng bộ nhớ mà nó thực sự đang sử dụng, bộ nhớ mà nó đã ánh xạ vào chính nó (ví dụ: card màn hình RAM cho Máy chủ X), các tệp trên đĩa đã được ánh xạ vào nó (đáng chú ý nhất là các thư viện được chia sẻ) và bộ nhớ được chia sẻ với các quy trình khác. VIRT biểu thị số lượng bộ nhớ mà chương trình có thể truy cập tại thời điểm hiện tại.

RES là viết tắt của kích thước lưu trú, là đại diện chính xác cho bao nhiêu bộ nhớ vật lý thực tế mà một quá trình đang tiêu thụ. (Điều này cũng tương ứng trực tiếp với cột% MEM.) Điều này hầu như sẽ luôn nhỏ hơn kích thước VIRT, vì hầu hết các chương trình phụ thuộc vào thư viện C.

SHR cho biết kích thước VIRT thực sự có thể chia sẻ được bao nhiêu (bộ nhớ hoặc thư viện). Trong trường hợp của các thư viện, nó không nhất thiết có nghĩa là toàn bộ thư viện là cư dân. Ví dụ: nếu một chương trình chỉ sử dụng một vài chức năng trong thư viện, toàn bộ thư viện sẽ được ánh xạ và sẽ được tính trong VIRT và SHR, nhưng chỉ các phần của tệp thư viện chứa các hàm được sử dụng sẽ thực sự được tải vào và được tính theo RES.

18
Franck Dernoncourt

Cột VIRT trong đầu ra ps/top gần như không liên quan để đo mức sử dụng bộ nhớ. Đừng lo lắng về nó. Apache tải nặng VIRT so với bộ nhớ RES

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-Java-under-linux-too-much-memory- used

5
leonbloy

VIRtual cột trên cùng, đề cập đến siêu không gian (siêu không gian tiêu thụ) của quy trình, mà quá trình có thể không thực sự diễn ra trong thời gian chạy. Có một cột khác RESident, đề cập đến bộ nhớ/không gian vật lý thực tế được phân bổ bởi quy trình, tại thời gian chạy.

Lý do cho sự khác biệt, giữa hai ví dụ, có thể được hiểu bằng ví dụ: nếu quy trình đang sử dụng thư viện nhất định, thì kích thước thư viện, cũng sẽ hỗ trợ cho virtual-size. tuy nhiên, vì chỉ một phần của thư viện sẽ được sử dụng (nghĩa là một số phương thức đang sử dụng), do đó sẽ hỗ trợ resident-size.

Tham khảo Thông tin thêm

2
parasrish

Linux hỗ trợ bộ nhớ ảo, nghĩa là sử dụng đĩa như một phần mở rộng của RAM để kích thước hiệu quả của bộ nhớ có thể sử dụng tăng lên tương ứng. Nhân sẽ ghi nội dung của khối bộ nhớ hiện không được sử dụng vào Đĩa cứng để có thể sử dụng bộ nhớ cho mục đích khác. Khi cần nội dung ban đầu, chúng sẽ được đọc lại vào bộ nhớ. Tất cả được làm trong suốt cho người dùng, các chương trình chạy trong Linux chỉ thấy lượng bộ nhớ lớn hơn Có sẵn và không để ý rằng thỉnh thoảng các bộ phận của chúng cư trú trên đĩa. Tất nhiên, việc đọc và ghi đĩa cứng chậm hơn (theo thứ tự chậm hơn hàng nghìn lần) so với sử dụng bộ nhớ thực, vì vậy các chương trình không ' T chạy càng nhanh. Phần của đĩa cứng được sử dụng làm bộ nhớ ảo được gọi là không gian trao đổi.

Linux có thể sử dụng một tệp bình thường trong hệ thống tệp hoặc phân vùng riêng cho không gian trao đổi. Phân vùng trao đổi nhanh hơn, nhưng việc thay đổi kích thước của tệp hoán đổi sẽ dễ dàng hơn (không cần phải phân vùng lại toàn bộ đĩa cứng và có thể cài đặt mọi thứ từ đầu). Khi bạn biết bạn cần bao nhiêu dung lượng trao đổi, bạn nên đi phân vùng trao đổi, nhưng nếu không chắc chắn, bạn có thể sử dụng tệp hoán đổi trước, sử dụng hệ thống trong một thời gian để bạn có thể cảm nhận được bạn đã trao đổi bao nhiêu cần, và sau đó tạo một phân vùng trao đổi khi bạn tự tin về kích thước của nó.

Bạn cũng nên biết rằng Linux cho phép một người sử dụng một số phân vùng trao đổi và/hoặc trao đổi các tệp cùng một lúc. Điều này có nghĩa là nếu đôi khi bạn chỉ cần một lượng không gian hoán đổi bất thường, bạn có thể thiết lập một tệp hoán đổi bổ sung vào những thời điểm như vậy, thay vì giữ toàn bộ số tiền được phân bổ mọi lúc.

Một lưu ý về thuật ngữ hệ điều hành: khoa học máy tính thường phân biệt giữa hoán đổi (viết toàn bộ quá trình ra để hoán đổi không gian) và phân trang (chỉ viết các phần có kích thước cố định, thường là vài kilobyte, tại một thời điểm). Phân trang thường hiệu quả hơn và đó là những gì Linux làm, nhưng thuật ngữ Linux truyền thống nói về việc hoán đổi.

Nguồn: http://www.faqs.org/docs/linux_admin/x1752.html

1
user42198

"VIRT" chỉ là không gian địa chỉ, RES là bộ nhớ "thực", nhưng lượng "SHR" (= chia sẻ) của "RES" là một phần của RES được chia sẻ với các quy trình khác. Vì vậy, đối với hầu hết các quy trình, tôi tin rằng bằng cách trừ SHR khỏi RES sẽ mang lại cho bạn dung lượng bộ nhớ thực sự có thể quy cho quy trình cụ thể này.

0
Max