Hiểu cách sử dụng bộ nhớ ảo> trao đổi + vật lý trên Linux


9

Tôi có một quy trình được báo cáo trong 'top' rằng nó có 6GB bộ nhớ lưu trú và 70GB bộ nhớ ảo được phân bổ. Điều kỳ lạ là máy chủ đặc biệt này chỉ có 8GB vật lý và 35GB dung lượng trao đổi có sẵn.

Từ hướng dẫn 'hàng đầu':

   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. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

Đưa ra lời giải thích này, tôi sẽ mong đợi việc cấp phát bộ nhớ virut cho một quá trình được giới hạn trong trao đổi + bộ nhớ vật lý có sẵn của tôi.

Theo 'pmap', mã, thư viện dùng chung và các phần bộ nhớ dùng chung của quy trình này đều tối thiểu - không quá 300M hoặc hơn.

Rõ ràng, máy và quy trình vẫn hoạt động chính xác (mặc dù chậm), vậy tôi còn thiếu gì ở đây?

Câu trả lời:


9

Nó có thể là bộ nhớ không yêu cầu không có trong ram vật lý hoặc trong tệp trang.

Một số tài nguyên bạn có thể muốn xem xét:

Ứng dụng của bạn có tạo ra nhiều trang bộ nhớ trống không? Nếu vậy, ứng dụng của bạn có thể được hưởng lợi rất nhiều từ:

Nó cho phép bạn nén và giải nén trong các trang bộ nhớ thời gian thực. Đổi lại, bạn có thể giữ mọi thứ trong RAM thay vì trao đổi vào đĩa ( rất chậm ).


Có, ứng dụng đang thực hiện rất nhiều mối tương quan trong không gian IPV4, do đó, ứng dụng có thể có nhiều trang trống tùy thuộc vào phân phối lưu lượng. Chúng ta sẽ phải coi chừng điều đó. Cảm ơn!
Bụng

rất vui khi được giúp đỡ, hy vọng một số người dùng khác sẽ đánh dấu tôi. Tôi đưa ra câu trả lời kẻ giết người nhưng tôi được xếp hạng 1.266 :-(. Tôi không nghĩ người dùng lỗi máy chủ như tôi hahhah
The Unix Janitor

1
Một số lý do tại sao mọi người không thể bỏ phiếu cho bạn: 1. Định dạng câu trả lời của bạn --- sử dụng đánh dấu. 2. Tên người dùng của bạn có vẻ chung chung. 3. Quan trọng nhất: Thực tế là bạn thấy nó đủ quan trọng để bình luận về nó. Để lại một vị chua trong miệng của mọi người.
Belmin Fernandez

@ user37899 Upvotes có xu hướng rơi vào 3 loại: câu trả lời có nhiều thông tin như thế nào, nó được định dạng tốt và dễ đọc như thế nào, và câu hỏi phổ biến như thế nào. Tôi sẽ làm việc với định dạng của bạn, nhưng bạn cũng phải có một số zen và nhận ra rằng một số câu trả lời tuyệt vời nằm xung quanh trang web với chỉ một câu hỏi - sự phổ biến của một câu hỏi là yếu tố có hiệu quả nhất.
Jeff Ferland

1
Đã làm một số định dạng. Hy vọng nó sẽ giúp heh.
Belmin Fernandez

2

Đây là một cuộc thảo luận về đức so với bộ nhớ cư dân:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory- used

Cuộc thảo luận đề cập đến các quy trình Java, nhưng có thể áp dụng cho mọi thứ chạy trên Linux. Điểm chính liên quan đến đức là tổng số bao gồm cả một loạt các công cụ có thể không bao giờ được sử dụng. Virt là một cái gì đó để xem xét cho các HĐH 32 bit (vì các quy trình sẽ đạt giới hạn về không gian địa chỉ), nhưng phần lớn không hữu ích nếu không. Như đã lưu ý, điều cần chú ý là bộ nhớ lưu trú, sẽ bị giới hạn ở RAM vật lý có sẵn và trao đổi của bạn.


anh ta thực sự đã hỏi tại sao bộ nhớ ảo được phân bổ lớn hơn bộ nhớ vật lý của mình + không gian hoán đổi ..
The Unix Janitor

Vâng, và cuộc thảo luận trong Stackoverflow nói về việc điều đó có thể như thế nào.
cjc

1

Điều này có thể là do không gian địa chỉ của quy trình có kích thước như bạn đã nêu, nhưng nó không thực sự được phân bổ bởi HĐH.

Từ: http://lwn.net/Articles/428100/

Trong quá trình cố gắng đạt được mục tiêu "đủ chi phí thấp và không có độ trễ đáng kể", các nhà phát triển Go đã đưa ra một số giả định đơn giản hóa, một trong số đó là bộ nhớ được quản lý cho một ứng dụng đang chạy đến từ một địa điểm gần như duy nhất phạm vi địa chỉ. Các giả định như vậy có thể gặp phải cùng một vấn đề mà trình soạn thảo của bạn gặp phải với vi - mã khác có thể phân bổ các phần ở giữa phạm vi - vì vậy các nhà phát triển Go đã áp dụng cùng một giải pháp: họ chỉ phân bổ tất cả bộ nhớ mà họ nghĩ họ cần (họ đã tìm ra, một cách hợp lý, 16GB đó sẽ đủ cho hệ thống 64 bit) khi khởi động.

Vì vậy, đôi khi đó là cách quản lý bộ nhớ không được thực hiện - có một không gian địa chỉ liên tục đơn giản hóa việc giải phóng các mem không sử dụng.


0

Câu trả lời có lẽ là MMAP - dữ liệu nằm trên đĩa, nhưng nó nằm ngoài "trao đổi" và không thể nhìn thấy bằng lệnh "miễn phí" hoặc "trên cùng".

Nếu quy trình java không quá phức tạp, bạn có thể thử chơi với "lsof" để tìm vị trí tệp MMAP. Tuy nhiên nếu quá trình java này phức tạp, sẽ khó có thể nhìn thấy.


-1

Tôi cũng ngạc nhiên khi Linux cho phép bạn phân bổ bộ nhớ ảo nhiều hơn bộ nhớ vật lý + không gian hoán đổi, nhưng rõ ràng nó giúp hiệu năng trong các tình huống điển hình.

May mắn thay, có một tham số điều chỉnh kernel có thể được sử dụng để chuyển đổi chế độ kế toán bộ nhớ. Tham số này là vm.overcommit_memory và nó cho biết thuật toán nào được sử dụng để theo dõi bộ nhớ khả dụng. Mặc định (0), sử dụng phương pháp heuristic và vượt quá hệ thống bộ nhớ ảo. Nếu bạn muốn các chương trình của mình nhận được các lỗi hết bộ nhớ phù hợp khi phân bổ thay vì khiến các quá trình của bạn bị giết ngẫu nhiên, bạn nên đặt tham số này thành 2.

http://www.linuxjournal.com/article/10678


Điều này là hoàn toàn bối rối. Overcommit không phải là thứ cho phép bạn phân bổ nhiều bộ nhớ ảo hơn bộ nhớ vật lý cộng với không gian trao đổi. Bạn có thể làm điều đó ngay cả khi không có quá nhiều. (Ví dụ, trên một máy tính với RAM 2GB, không trao đổi, và không có overcommit, bạn vẫn có thể nhớ ánh xạ một tập tin 4GB chỉ đọc, sử dụng 4GB bộ nhớ ảo.)
David Schwartz
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.