Làm thế nào để vô hiệu hóa hoàn toàn trao đổi?


30

Tôi đang sử dụng Debian sid, ổ cứng được định dạng bằng ext4, chạy trên linux 3.1

Tôi nhớ trên các phiên bản linux trước đây (có thể trước 3.0), nếu tôi hết bộ nhớ và trao đổi không được bật, các chương trình thường sẽ bị sập. Điều này là hoàn hảo cho môi trường của tôi: duyệt web đơn giản không có hoạt động quan trọng. Đó là, nếu tôi vô tình chạy trên một trang web xấu sử dụng quá nhiều bộ nhớ, nó chỉ bị sập mà không khiến thiết bị đầu cuối của tôi không sử dụng được.

Nhưng trong thiết lập hiện tại của tôi, máy tính bị treo với thông lượng I / O bạo lực ở chế độ nền. iotop tiết lộ kswapd0 là thủ phạm, có nghĩa là do hoán đổi. Sau khi sử dụng swapon -sđể xác định bất kỳ giao dịch hoán đổi nào được kích hoạt, tôi đã sử dụng swapoff -ađể vô hiệu hóa tất cả các giao dịch hoán đổi và swapon -smột lần nữa để xác nhận rằng tất cả các giao dịch hoán đổi đã bị vô hiệu hóa.

Sau đó, tôi đã cố gắng tối đa hóa việc sử dụng bộ nhớ của mình một lần nữa. Than ôi, hành vi tôi mong đợi đã không xảy ra. Thay vào đó, kswapd0 cố gắng lặp đi lặp lại để trao đổi RAM và thất bại vì không có không gian trao đổi. Bởi vì nó không bao giờ bỏ cuộc, máy tính của tôi bị khóa trong trạng thái đóng băng nặng I / O vĩnh viễn, không tốt cho sức khỏe của đĩa.

Tôi đang làm điều gì sai trong việc cố gắng swapoff -a? Tại sao hành vi khác với hành vi trước đây (có thể là trước 3.0 lần)?


Điều đó không thực sự có ý nghĩa. Làm swapoff -a chính nó , nếu có công cụ trong trao đổi, sẽ tạo ra rất nhiều I / O (và có thể dẫn đến các quá trình bị giết nếu không có đủ RAM thực sự). Bạn có chắc chắn đó không phải swapoff -alà nguyên nhân gây ra "cơn bão" I / O?
Mat

1
Tôi cho rằng nó là đủ để bình luận fstabdòng về trao đổi. Hãy thử nếu hành vi là như nhau.
enzotib

@Mat swapoff -anên vô hiệu hóa trao đổi vĩnh viễn, có nghĩa là nó sẽ bị vô hiệu hóa sau lần khởi động lại tiếp theo. Tôi đã xác nhận điều này. Tuy nhiên, "cơn bão" I / O vẫn xảy ra trong phiên sau lần khởi động lại tiếp theo. Đối với hồ sơ, "cơn bão" I / O đã không xảy ra tại thời điểm tôi đã làm swapoff -abởi vì hoán đổi là 0 tại thời điểm đó.
syockit

9
@syockit: swapoff -akhông vĩnh viễn.
Mat

1
tải cơ sở dữ liệu đã đạt khoảng 15% trong 14 giờ. Tắt trao đổi, và trong lần thử tiếp theo, nó đã nhận được tới 40% trong 4 giờ. thừa nhận, máy chủ không được cung cấp năng lượng và chạy chậm trên ram, nhưng không có trao đổi, bật OpenSuSE hoạt động nhanh hơn nhiều cho quy trình này. Ý kiến ​​của OS về "tốt hơn" và của tôi khác nhau đáng kể trong quá trình tải db mysql đơn giản. đã nhận xét ổ đĩa trao đổi trong / etc / fstab và khởi động lại.
TheSatinKnight

Câu trả lời:


15

Vô hiệu hóa trao đổi sẽ không làm những gì bạn muốn. Bạn vẫn sẽ nhận được thông lượng I / O bạo lực, nhưng nó sẽ là các trang sạch hơn là các trang bẩn.

Không có trao đổi, hệ thống sẽ nén bộ nhớ cache của các trang sạch (chưa sửa đổi) về gần bằng 0, vì đó là những trang duy nhất nó có thể đuổi khỏi bộ nhớ vật lý. Nó chỉ có thể đuổi các trang bẩn (đã sửa đổi) khỏi bộ nhớ bằng cách viết chúng để trao đổi, không có trao đổi, nó không có cách nào để đuổi các trang bẩn.

Khi bạn sử dụng ít bộ nhớ vật lý, mỗi quy trình sẽ phải tải các trang mã của nó từ đĩa khi nó hiển thị các trang mã quy trình trước đó. Kết quả sẽ là đập dữ dội và làm việc quá mức được thực hiện bởi hệ thống con trao đổi.

Đây là trường hợp đặc biệt của một nguyên tắc rất quan trọng: Đối với một hệ thống được thiết kế tốt, bạn không thể làm cho nó chạy tốt hơn bằng cách giảm các lựa chọn của nó. Linux là một hệ thống được thiết kế tốt. Loại bỏ trao đổi chỉ mang lại cho nó ít lựa chọn hơn, vì vậy không có gì đáng ngạc nhiên khi nó hành xử tồi tệ hơn.


1
Điều này chỉ đúng nếu bạn phân bổ chỉ thiếu bộ nhớ. Một quá trình chạy trốn thường sẽ cố gắng phân bổ nhiều hơn nữa, và vì vậy nó sẽ bị giết sớm, giải phóng bộ nhớ đó, trái ngược với việc tiếp tục hoán đổi hệ thống sang cái chết cố gắng cung cấp thêm phân bổ, do đó, vô hiệu hóa trao đổi có thể hữu ích khi bạn chỉ sử dụng tối đa việc sử dụng ram của mình từ quy trình chạy trốn.
psusi

1
Chỉ cần thiếu tất cả bộ nhớ sẽ luôn luôn được phân bổ. Linux được điều chỉnh đặc biệt theo cách này. Thực cat /proc/meminfohiện bất kỳ hộp Linux thông thường nào sau vài giờ tải.
David Schwartz

2
@syockit Nếu bạn tắt phân trang, bạn không thể chạy bất kỳ chương trình nào. Phân trang là cơ chế mà các tệp được đọc khi ánh xạ vào bộ nhớ.
David Schwartz

2
@psusi: Các trang sạch sẽ không bị giảm đến mức tối thiểu khi bạn trao đổi. Thay vào đó, nó sẽ trao đổi các trang nặc danh, bẩn thỉu chưa được sử dụng gần đây. Tất nhiên, dù bằng cách nào, cuối cùng bạn cũng sẽ bị đập dữ dội nếu bộ làm việc vượt quá bộ nhớ vật lý. Vấn đề là, có hoặc không có trao đổi, bạn sẽ nhận được rất nhiều cú đập dữ dội trước khi bạn thực sự hết bộ nhớ. Sự khác biệt là, với hoán đổi, việc đập dữ dội sẽ được hoán đổi (trang bẩn, viết và đọc). Nếu không trao đổi, việc đập dữ dội sẽ là lỗi mã (trang sạch, chỉ đọc).
David Schwartz

2
@psusi: Bạn đúng nếu mối quan tâm là một quá trình chạy trốn nhanh chóng tiêu tốn bộ nhớ. Nhưng đó không phải là những gì OP đang nói, đó là một quá trình tiêu tốn quá nhiều, nhưng không bị ràng buộc hoặc quá nhiều bộ nhớ. Khi nó phát triển qua điểm ngọt lớn (nơi bộ nhớ cache bị nén), nó sẽ phát triển ngày càng chậm hơn khi hệ thống đập.
David Schwartz

13

Một giải pháp tốt hơn là tắt trao đổi, điều này sẽ gây ra các quá trình ngẫu nhiên bị giết khi bộ nhớ sắp hết, là đặt giới hạn phân đoạn dữ liệu cho mỗi quy trình cho các quy trình rút mạng. Bằng cách này, một trình duyệt chạy trốn sẽ đạt đến giới hạn và chết, thay vì làm cho toàn bộ hệ thống trở nên không sử dụng được. Ví dụ, từ vỏ

(ulimit -d 400000; firefox) &

Số sau -d tính bằng kilobyte. Bạn nên thử nghiệm điều này trên hệ thống của bạn để chọn giá trị tốt nhất cho thói quen duyệt web của bạn. Các dấu ngoặc đơn gây ra một lớp con được tạo ra; lệnh ulimit chỉ ảnh hưởng đến lớp vỏ đó và các con của nó, cô lập các hiệu ứng của nó với lớp vỏ cha.


Điều này sẽ làm việc cho crom, giả sử, nơi chúng ta có một loạt các chromiumquá trình sử dụng các khối bộ nhớ nhỏ?
jberryman

@jberryman Không, giới hạn bộ nhớ là theo quy trình chứ không phải mỗi người dùng.
Kyle Jones

Có cách nào để gửi cho nó một tín hiệu được chỉ định (ví dụ: SIGHUP) khi đạt đến giới hạn bộ nhớ không?
Geremia

1
@Geremia Không. Hệ thống brk và sbrk ngừng hoạt động, điều này sẽ khiến hầu hết mọi thứ cuộn tròn và chết.
Kyle Jones

Nếu bạn muốn điều chỉnh thủ công, tôi khuyên bạn nên sử dụng nhóm bộ nhớ thay vì ulimit vì với nhóm bộ nhớ, bạn có thể đặt giới hạn cho toàn bộ nhóm quy trình có thể định cấu hình quy trình cấp phát bộ nhớ để dừng và quy trình chính sách chế độ người dùng của bạn có thể quyết định điều gì làm (ví dụ gửi một số tín hiệu, chọn quá trình bị giết, tăng giới hạn bộ nhớ khi đang bay). Xem kernel.org/doc/Documentation/cgroup-v1/memory.txtkernel.org/doc/Documentation/cgroup-v2.txt để biết chi tiết.
Mikko Rantalainen

4

Để đảm bảo rằng trao đổi không được sử dụng, tốt hơn hết bạn nên ngăn chặn bất kỳ trao đổi nào được thêm vào khi khởi động. Điều này có thể được thực hiện, tùy thuộc vào hệ thống, bằng cách vô hiệu hóa swapdịch vụ khởi động hoặc chỉ nhận xét về mục trao đổi trong /etc/fstab.

Theo như liên quan đến hangout của bạn, stop()chức năng trong /etc/init.d/swapcó thể đưa ra manh mối:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Lưu ý phần về bế tắc . Bạn có thể thử umount -a -t tmpfstự làm trước khi tắt trao đổi.


Chỉnh sửa:

Có lẽ, bạn cũng có thể đạt được mục tiêu của mình bằng cách sửa đổi sysctlcài đặt (xem câu hỏi này ).


Tôi không có swaptrong init.d, cũng không làm tôi có nó trên fstab, nhưng tôi có /etc/init.d/mountoverflowtmpmà gắn kết tmpfscho ghi log khẩn cấp. Có phải daemon trao đổi sử dụng tmpfsquá?
syockit

Bạn có thể kích hoạt nó ở nơi khác - làm grep -RF swap /etc/nếu bạn muốn tìm nó. Nhưng để vô hiệu hóa một dịch vụ, bạn sẽ sử dụng một lệnh như service(IIRC; Tôi không sử dụng Debian).
rozcietrzewiacz

1
Bản thân hoán đổi không sử dụng tmpfs , vì tmpfslà một hệ thống tập tin trong bộ nhớ (RAM). Nhưng các dịch vụ / chương trình khác sử dụng tmpfscó thể dựa vào trao đổi theo cách đặc biệt. Tôi thực sự không biết, nhưng nó có thể có liên quan đến bộ nhớ đệm hoặc một cách đặc biệt trong đó tmpfstrình điều khiển yêu cầu quyền truy cập vào không gian trao đổi.
rozcietrzewiacz

Có điều gì đó về cách Linux xử lý bộ nhớ ảo mà tôi không hiểu. Tôi đã vô hiệu hóa trao đổi theo hầu hết các cách có thể: thông qua swapoffvà thông qua vm.swappiness=0. Vậy kswapd0mà vẫn chạy! Tôi tự hỏi liệu đây có phải là hồi quy từ 2,4 ngày không
syockit

5
@syockit Đó là hành vi dự kiến. Hệ thống vẫn đang trao đổi các trang sạch (các trang có chứa các bản sao của dữ liệu tệp). Nó không yêu cầu không gian hoán đổi để hoán đổi các trang sạch, vì chúng có thể được đọc lại từ các nguồn khác ngoài trao đổi.
David Schwartz

2

Nó là tốt hơn để bình luận ra mục nhập phân vùng trao đổi trong /etc/fstabhơn là chạy swapoff -asau mỗi lần khởi động.

Tôi có cùng một vấn đề với kswapd0 trên phần cứng của tôi.

Điều chỉnh vm.swappinesstham số hệ thống không giúp tôi.

sysctl -w vm.swappiness=0

Tôi đã googled và đọc rất nhiều bài viết, danh sách gửi thư, và bây giờ tôi nghĩ rằng đây là lỗi kernel.

Khi không có phân vùng trao đổi hoạt động và bộ nhớ trống trở nên ít hơn một số ngưỡng (khoảng 300 MB trong trường hợp của tôi), hệ thống sẽ không phản hồi do sự điên cuồng kswapd0.

Có lẽ nó được sao chép với cấu hình và điều kiện đặc biệt.

Đối với ai đó, nó được giải quyết bằng cách cài đặt lại hệ thống với phân vùng lại cho người khác bằng cách xây dựng kernel tùy chỉnh kswapd0bị vô hiệu hóa.


2
Nếu kswapd0phát điên và bạn không trao đổi kích hoạt, bạn hết RAM. Lựa chọn của bạn là OOM Killer hoặc kswapd0. Linux đi cùng kswapd0bởi vì hạt nhân giả định rằng việc hoàn thành chậm quan trọng hơn là hủy bỏ quá trình. Đối với người bình thường, ngưỡng mà hạt nhân nghĩ rằng tiến trình đủ về phía trước vẫn xảy ra đã chậm chạp và gần như bất kỳ ai cũng muốn chọn OOM Killer.
Mikko Rantalainen

1

Trên hệ thống của tôi (debian sid 2016-11-15), tôi đã làm điều này:

  1. vô hiệu hóa trao đổi ngay bây giờ:

    swapoff -a
    
  2. nhận xét dòng với phân vùng trao đổi trong / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. vô hiệu hóa việc gắn trao đổi trong systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Nó sẽ là đủ. Có tài liệu tham khảo về trao đổi trong /etc/initramfs-tools/conf.d/resumetập tin. Tôi không biết mục đích của việc này là gì. Có thể tệp này sẽ gặp sự cố trong lần khởi động lại tiếp theo (Tôi chưa thử khởi động lại, thời gian hoạt động của tôi rất quý;)).


1

máy tính bị treo với thông lượng I / O dữ dội trong nền. iotop tiết lộ kswapd0 là thủ phạm

Tôi đã tìm thấy một cách (cho đến nay) để tránh điều đó. Nếu bạn muốn kiểm tra nó và xem nó hoạt động như thế nào trên hệ thống của bạn, hãy xem bản vá kernel bên trong câu hỏi này . Về cơ bản, nó không đuổi Active(file)các trang (ít nhất) khi bị áp lực bộ nhớ, do đó, việc đập đĩa (đọc liên tục) giảm xuống gần như không có gì và OOM-killer được phép kích hoạt trong vòng 1 giây, thay vì đóng băng HĐH cho những gì dường như như vĩnh viễn (hoặc ít nhất là trong nhiều phút). Tôi hy vọng rằng các lập trình viên thực tế (trong đó tôi không) sẽ cải thiện bản vá và biến nó thành một giải pháp thực tế, bây giờ họ thấy rằng những gì nó làm được cho các tình huống này.


Bản vá nhân này đã được xử lý chính chưa?
nhân

@humanityANDpeace có lẽ là không, vì nó không tốt (vì tôi không phải là lập trình viên), tuy nhiên tôi đã gặp phải một số vấn đề với nó, chẳng hạn như: đôi khi, tùy thuộc vào khối lượng công việc, với bản vá này , bạn có thể hết bộ nhớ trong các trường hợp trong đó không có bản vá này, bạn sẽ không có và do đó, OOM-killer sẽ giết Xorg và xfwm4, UNLESS Tôi chạy echo 1 | sudo tee /proc/sys/vm/drop_cacheskhi Active(file):(của / Proc / meminfo) trên 2GB (trên hệ thống RAM 16G) -có thể đạt tối đa 4G
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.