it-swarm-vi.com

Tại sao sử dụng trao đổi khi có quá nhiều không gian trống trong RAM?

Sử dụng hoán đổi dung lượng thay vì RAM có thể làm chậm đáng kể PC.

Vậy tại sao, khi tôi có quá đủ RAM khả dụng, hệ thống Linux (Arch) của tôi có sử dụng trao đổi không?

Kiểm tra đầu ra conky của tôi dưới đây:

conky output

Ngoài ra, đây có thể là nguyên nhân của các vấn đề về tốc độ và đáp ứng hệ thống mà tôi gặp phải không?

Đầu ra của free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
132
Stefan

Việc các hệ thống Linux sử dụng là bình thường một số trao đổi ngay cả khi vẫn còn RAM miễn phí. Nhân Linux sẽ chuyển sang hoán đổi các trang bộ nhớ rất hiếm khi được sử dụng (ví dụ: , các trường hợp getty khi bạn chỉ sử dụng X11 và một số trình nền không hoạt động khác).

Việc sử dụng không gian hoán đổi trở thành một vấn đề chỉ khi không đủ RAM khả dụng, và hạt nhân buộc phải liên tục di chuyển các trang bộ nhớ để trao đổi và quay lại RAM, chỉ để Giữ các ứng dụng chạy. Trong trường hợp này, các ứng dụng giám sát hệ thống sẽ hiển thị rất nhiều hoạt động I/O của đĩa.

Để so sánh, hệ thống Ubuntu 10.04 của tôi, với hai người dùng đã đăng nhập bằng các phiên X11 đều chạy máy tính để bàn Gnome, sử dụng ~ 600 MB trao đổi và ~ 1GB RAM (không tính bộ đệm và bộ đệm fs), vì vậy Tôi muốn nói rằng số liệu của bạn để sử dụng trao đổi trông bình thường.

96
Riccardo Murri

Hành vi này có thể được cấu hình bằng cách đặt giá trị của:

/proc/sys/vm/swappiness

Giá trị mặc định là 60. Đặt nó thành 0 có nghĩa là không bao giờ sử dụng trao đổi khi vẫn còn RAM còn lại và 100 được hoán đổi bộ nhớ càng sớm càng tốt.

Để thay đổi giá trị tạm thời (mất khi khởi động lại):

Sudo sysctl vm.swappiness=10

Để thay đổi giá trị vĩnh viễn, chỉnh sửa tệp:

/etc/sysctl.conf

là root (ví dụ: Sudo nano /etc/sysctl.conf) và thay đổi hoặc thêm (nếu không có) dòng:

vm.swappiness

đến giá trị mong muốn. Nếu tệp này không tồn tại (ví dụ: trong Arch Linux), thì hãy thử /etc/sysctl.d/99-sysctl.conf thay thế.

Đã có một số tranh luận về việc trao đổi với bộ nhớ trống có sẵn là tốt hay xấu, nhưng trợ giúp Ubuntu thực sự đề xuất giá trị 10 cho các hệ thống Máy tính để bàn . Xem thêm hướng dẫn này về Digital Ocean cho CentOS .

96
Marcel Stimberg

Linux bắt đầu hoán đổi trước khi RAM được lấp đầy. Điều này được thực hiện để cải thiện hiệu suất và khả năng phản hồi:

  • Hiệu suất được tăng lên vì đôi khi RAM được sử dụng tốt hơn cho bộ đệm đĩa hơn là lưu trữ bộ nhớ chương trình. Vì vậy, tốt hơn là bạn nên trao đổi một chương trình không hoạt động trong một thời gian và thay vào đó giữ các tệp thường được sử dụng bộ nhớ cache.

  • Khả năng đáp ứng được cải thiện bằng cách hoán đổi các trang khi hệ thống không hoạt động, thay vì khi bộ nhớ đầy và một số chương trình đang chạy và yêu cầu thêm RAM để hoàn thành tác vụ.

Hoán đổi làm chậm hệ thống, tất nhiên - nhưng thay thế cho việc hoán đổi không phải là hoán đổi, nó có nhiều hơn RAM hoặc sử dụng ít RAM hơn.

Đây là một bài viết cũ, tuy nhiên, tôi vẫn sẽ tự do đưa ra những suy nghĩ của tôi ở đây.

Bắt đầu từ bên dưới, trước tiên Linux sẽ chia bộ nhớ thành các trang (thường là 4K trên mỗi trang trên hệ thống x86_64). Sau đó, bộ nhớ ảo được tạo, có ánh xạ được thực hiện với bộ nhớ vật lý bằng cách sử dụng MMU (Đơn vị quản lý bộ nhớ).

Các quy trình được phân bổ bộ nhớ từ vùng bộ nhớ ảo, vì vậy xin lưu ý, khi bạn xem/Proc/meminfo, bạn sẽ thấy VMalloc * là chi tiết bộ nhớ ảo.

Hãy nói rằng bạn có một quy trình yêu cầu bộ nhớ (giả sử 300MB - trình duyệt web). Quá trình sẽ được phân bổ 300MB từ bộ nhớ ảo, tuy nhiên, không cần thiết nó được ánh xạ bộ nhớ (được ánh xạ tới bộ nhớ vật lý). Có khái niệm "Sao chép ghi" để quản lý bộ nhớ, theo đó, nếu các quy trình của bạn thực sự sử dụng bộ nhớ được cấp phát từ bộ nhớ ảo (nghĩa là nó ghi một số vào bộ nhớ), chỉ sau đó nó được ánh xạ vào bộ nhớ vật lý. Điều này hỗ trợ kernel hoạt động tốt trong môi trường nhiều quá trình một cách hiệu quả.

Bộ nhớ cache là gì?

Rất nhiều bộ nhớ được sử dụng bởi các quy trình được chia sẻ. Hãy nói rằng thư viện glibc được sử dụng bởi hầu hết các quy trình. Điểm giữ nhiều bản sao của glibc trong bộ nhớ là gì, khi mọi quá trình có thể truy cập cùng một vị trí bộ nhớ và thực hiện công việc. Các tài nguyên được sử dụng thường xuyên như vậy được giữ trong bộ đệm để khi xử lý yêu cầu, chúng có thể được tham chiếu đến cùng một vị trí bộ nhớ. Điều này giúp tăng tốc quá trình, vì đọc lại glibc (v.v.) & một lần nữa từ đĩa sẽ tốn thời gian.

Ở trên là cho các thư viện chia sẻ mỗi lần nói, tương tự cũng đúng với việc đọc tệp. Nếu bạn đọc một tệp lớn (giả sử 100-200 MB) lần đầu tiên, sẽ mất rất nhiều thời gian. Tuy nhiên, khi bạn cố gắng và làm lại đọc tương tự, nó sẽ nhanh hơn. Dữ liệu được lưu trong bộ nhớ và việc đọc lại không được thực hiện cho tất cả các khối.

Bộ đệm là gì?

Liên quan đến bộ đệm, khi một tiến trình thực hiện I/O, nó dựa vào bộ đệm của kernel để ghi dữ liệu vào đĩa. Các quy trình, yêu cầu kernel để thực hiện công việc. Vì vậy, thay mặt cho quá trình, kernel ghi dữ liệu vào "bộ đệm" của nó và thông báo cho quá trình rằng việc ghi được thực hiện. Theo cách không đồng bộ, kernel sẽ tiếp tục đồng bộ dữ liệu này trong bộ đệm vào đĩa. Theo cách này, các quy trình dựa vào kernel để chọn thời gian chính xác để đồng bộ dữ liệu vào đĩa và các quy trình có thể tiếp tục hoạt động trước. Hãy nhớ rằng, đây là I/O chung mà các quy trình thông thường đang làm. Tuy nhiên, các quy trình chuyên biệt, cần xác nhận rằng I/O thực sự được thực hiện trên đĩa có thể sử dụng cơ chế khác để thực hiện I/O trên đĩa. Một số tiện ích mã nguồn mở là libaio. Ngoài ra, có nhiều cách để gọi đồng bộ hóa rõ ràng đến các FD được mở trong ngữ cảnh quy trình của bạn, để bạn buộc kernel phải đồng bộ hóa dữ liệu vào đĩa để ghi mà bạn có thể đã thực hiện.

Lỗi trang là gì?

Hãy xem xét một ví dụ, khi bạn bắt đầu một quá trình (giả sử trình duyệt web), có nhị phân khoảng 300MB. Tuy nhiên, 300 MB hoàn chỉnh của nhị phân trình duyệt web không bắt đầu hoạt động ngay lập tức. Quá trình tiếp tục chuyển từ chức năng này sang chức năng trong mã của nó. Như đã nói trước đó, Bộ nhớ ảo sẽ được tiêu thụ 300 MB, tuy nhiên, không phải tất cả là bộ nhớ được ánh xạ vào bộ nhớ vật lý (RSS - bộ nhớ lưu trú sẽ ít hơn, xem đầu ra hàng đầu). Khi thực thi mã đạt đến một điểm, trong đó bộ nhớ không thực sự được ánh xạ vật lý, một lỗi trang sẽ là vấn đề. Kernel sẽ ánh xạ bộ nhớ này thành vật lý, liên kết trang bộ nhớ với quy trình của bạn. Một lỗi trang như vậy được gọi là "Lỗi trang nhỏ". Tương tự như vậy, khi một quá trình đang thực hiện các lỗi trang I/O chính được đưa ra.

Khi nào và tại sao Hoán đổi xảy ra?

Tình huống 1 :

Nội tuyến với các chi tiết ở trên, hãy xem xét một kịch bản khi lượng bộ nhớ tốt trở thành ánh xạ bộ nhớ. Và bây giờ một quá trình bắt đầu, đòi hỏi bộ nhớ. Như đã thảo luận ở trên, kernel sẽ có một số ánh xạ bộ nhớ. Tuy nhiên, không có đủ vật lý RAM có sẵn để ánh xạ bộ nhớ. Bây giờ, hạt nhân trước tiên sẽ nhìn vào bộ đệm, nó sẽ có một số trang bộ nhớ cũ không được sử dụng. các trang trên một phân vùng riêng (được gọi là SWAP), giải phóng một số trang và ánh xạ các trang được giải phóng theo yêu cầu mới sắp tới. Vì đĩa ghi chậm hơn nhiều so với RAM trạng thái rắn, quá trình này mất rất nhiều thời gian và do đó làm chậm được nhìn thấy.

Tình huống 2 :

Hãy nói rằng bạn thấy rất nhiều bộ nhớ trống có sẵn trong hệ thống. Thậm chí sau đó bạn thấy rằng có rất nhiều trao đổi xảy ra. Có thể có một vấn đề có thể xảy ra của sự phân mảnh bộ nhớ. Hãy xem xét một quy trình, đòi hỏi 50 MB bộ nhớ liền kề từ kernel. (ghi nhớ tiếp giáp). Rõ ràng, hạt nhân sẽ phân bổ các trang ngẫu nhiên cho các quy trình khác nhau và giải phóng một số trong số chúng. Tuy nhiên, khi chúng ta đòi hỏi bộ nhớ liền kề, nó sẽ phải tìm kiếm một đoạn dữ liệu đáp ứng nhu cầu của các quy trình. Nếu nó không thể có được bộ nhớ như vậy, nó sẽ phải thực hiện trao đổi ra khỏi một số trang bộ nhớ cũ và sau đó phân bổ các trang tiếp giáp. Ngay cả trong những trường hợp như vậy, SWAP sẽ xảy ra. Bắt đầu Kernel ver 2.6 trở lên, các vấn đề phân mảnh như vậy đã giảm đáng kể. Tuy nhiên, nếu hệ thống hoạt động trong một thời gian dài, những vấn đề như vậy vẫn có thể xảy ra.

Xem ví dụ này ( đầu ra vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, chúng tôi thấy rằng vẫn còn lượng miễn phí tốt RAM có sẵn. Tuy nhiên, ngay cả sau đó trao đổi đã xảy ra. Chúng tôi đã kiểm tra cây quy trình tại thời điểm này , và chúng tôi không thấy bất kỳ quá trình nào sắp tới sẽ đòi hỏi dung lượng bộ nhớ cao như vậy (hơn cả bộ nhớ trống). Sự nghi ngờ rõ ràng là Tình huống 2 được mô tả ở trên. -trình để kiểm tra những cái này, đầu ra đi vào syslog).

Đối với một hệ thống bình thường của chúng ta, việc so sánh thông tin khu vực thực hiện điều này. Và đồ thị cho bộ nhớ cache/free/low mem cũng được đề cập dưới đây

zone info

swap free low free

Nhìn vào thông tin, rõ ràng có sự phân mảnh bộ nhớ trong nút 0 & nút 1 bình thường (Nút đó là máy dựa trên NUMA, do đó có nhiều nút (xem numactl để kiểm tra thông tin cho hệ thống của bạn)).

Phân mảnh bộ nhớ cũng là một lý do tại sao việc sử dụng trao đổi có thể tăng ngay cả khi có bộ nhớ trống.

15
Anugraha Sinha

Có thêm bộ nhớ khả dụng

Giống như mọi người đã nói, trao đổi có sẽ giúp bạn thoát khỏi bộ nhớ không sử dụng, vì vậy nó có thể giúp bạn có nhiều bộ nhớ hơn.

Ngủ đông

Nhưng trao đổi cũng có thể được sử dụng cho ngủ đông có thể thực sự hữu ích khi bạn có máy tính xách tay hoặc muốn tiết kiệm năng lượng và đặt máy tính của bạn và làm việc trong chế độ ngủ đông trước khi rời khỏi công việc. Vì vậy, bạn có thể có một khởi đầu nhanh hơn vào buổi sáng sau.

Có chức năng ngủ đông là một trong những lý do chính mà chúng ta vẫn thấy hiện nay khuyên nên có ít nhất kích thước RAM cho việc hoán đổi. Bằng cách đó, hệ thống có thể đặt tất cả được sử dụng RAM vào trao đổi và đi vào trạng thái ngủ đông.

Truyện ngắn

Cẩn thận rằng một khi đã hoán đổi dữ liệu quá trình có thể được đọc trong trao đổi ngay cả sau khi tắt máy, trừ khi trao đổi được mã hóa (tất nhiên).

Sử dụng trao đổi được mã hóa với chế độ ngủ đông không hoạt động vượt trội với tất cả các bản phân phối. Bạn cần sử dụng khóa mã hóa không đổi (một số thiết lập tạo ngẫu nhiên khóa mã hóa không gian hoán đổi ở mỗi lần khởi động) và initrd/initramfs để kích hoạt âm lượng được mã hóa trước khi tiếp tục.

5
Huygens

Từ buntu Swap F.A.Q. mà Marcel đã liên kết với

Là tối thiểu cơ sở, rất khuyến khích rằng không gian trao đổi phải bằng với bộ nhớ vật lý (RAM). Ngoài ra, khuyến nghị rằng dung lượng trao đổi gấp đôi dung lượng bộ nhớ vật lý (RAM) tùy thuộc vào dung lượng ổ cứng

Tôi nghĩ bạn nên tăng không gian trao đổi trong hệ thống của bạn. Việc hoán đổi tăng tốc RAM cấp phát bộ nhớ bằng cách cho phép loại bỏ dữ liệu đã phân trang.

3
Jader Dias

Rất nhiều chương trình hiện đại được xây dựng trên các khung cồng kềnh kéo theo rất nhiều rác mà bạn không thực sự cần để chạy chương trình. Trao đổi các trang không sử dụng đó sẽ giải phóng RAM cho bộ đệm và các chương trình thực sự có thể sử dụng RAM.

Tôi nói từ kinh nghiệm cá nhân đau đớn ở đây.

Năm ngoái, tôi đã chuyển một trong những trang web của mình sang một khung máy chủ web mới đầy hứa hẹn được xây dựng trên Firefox. Nghe có vẻ lạ khi xây dựng một hệ thống phía máy chủ trên một chương trình tập trung vào máy khách như Firefox, nhưng nó có một số lợi ích to lớn. Firefox rất mạnh mẽ, cung cấp một số dịch vụ nội bộ thực sự ấn tượng và nó làm giảm sự không phù hợp trở kháng giữa máy chủ và máy khách để có cả hai nền tảng tương tự.

Nhưng có một nhược điểm: Firefox rất lớn. Thực sự lớn. Đây là một loại dự án phiên bản 1.x, vì vậy họ không gặp phải những vấn đề như loại bỏ hỗ trợ GUI. [*] Trang web của tôi không cần bất kỳ thứ gì trong số đó, nhưng vì công nghệ VPS mà nhà cung cấp dịch vụ lưu trữ của tôi đã sử dụng không ' Không cho phép trao đổi không gian, mã GUI đó và tất cả các phần khác của Firefox tôi đã không sử dụng RAM thực. Cuối cùng tôi cần 512 MB RAM tối thiể chỉ để chạy trang mà không bị sập do cạn kiệt bộ nhớ. Nếu VPS của tôi có dung lượng trao đổi, tôi có thể đã nhận được bằng gói dung lượng 256 MB.

[*] Việc xóa mã GUI khỏi khung công tác thậm chí có thể không được mong muốn, vì một trong những lợi ích của nền tảng này là quét web có độ chính xác cao, bởi vì khung phía máy chủ có thể tải xuống các trang web từ một trang web khác và bạn có thể thao tác chúng giống như bạn về phía khách hàng Hãy nghĩ về mashup. Rất nhiều thứ như vậy sẽ bị hỏng nếu bạn không thể "kết xuất" trang web vào một số bối cảnh đồ họa.

Nhân tiện, khung web này về cơ bản đã chết, vì vậy không có tên và điểm xấu hổ nào. Tốt nhất chỉ nên học bài học rộng hơn: có, trao đổi vẫn hữu ích ngay cả khi bạn có hợp đồng RAM miễn phí.

3
Warren Young

Tôi nghĩ rằng "Gilles" đã đề cập đến một thực tế rằng, trong khi bạn có thể có quá nhiều RAM, trao đổi có thể hữu ích trong những "thiếu sót" nhất định cũng như lưu liên tục một số dữ liệu ngay cả sau khi tắt máy - hoặc tôi đã sai khi cho rằng? kể từ RAM bị xóa sau khi khởi động lại) Tôi có 12GB RAM có sẵn trên hệ thống của tôi và tôi cũng đã suy nghĩ về câu hỏi này trước đây. điểm, khi tôi đã vô hiệu hóa tất cả các trao đổi và chỉ dựa vào RAM của mình, tôi đã có những trải nghiệm cực kỳ khó khăn khi cố gắng gỡ lỗi một số lỗi hệ thống hoặc sự cố, v.v. sau khi tắt hệ thống. Kể từ đó, tôi đã kích hoạt lại phân vùng trao đổi.

2
ILMostro_7