Cách chế ngự khả năng phản hồi, bộ nhớ và phân trang của Linux


27

Câu hỏi đầu tiên về tràn =) ... +100 tiền thưởng. Không thể nghĩ ra điều gì tôi thực sự quan tâm cho đến bây giờ:

Tôi thực sự chán ngấy với trạng thái phản hồi của máy tính để bàn Linux, ví dụ: http://brainstorm.ubfox.com/item/85/ - trong các tình huống có RAM trống thấp hoặc các tình huống có thông lượng đĩa cao, hệ thống chậm lại một con ; Điều này là hoàn toàn khủng khiếp cho các ứng dụng đòi hỏi hiệu năng tốt. Ngoài ra, giao diện người dùng hoàn toàn không phản hồi. So sánh điều này với OS X, trong đó nếu một ứng dụng đang ngốn tài nguyên, người ta luôn có thể nhấp chuột tùy chọn để Buộc thoát nó, trong khi trong Linux, tôi thậm chí không thể thay thế tab alt hoặc chuyển đổi máy tính để bàn, hoặc thậm chí ctrl-alt-f1 để có được thiết bị đầu cuối - tôi cũng có thể, chỉ mất khoảng 1-2 phút cho mỗi thao tác.

Tôi sử dụng gkrellm để tôi có thể thấy tình hình khi nó mở ra. Thông thường, việc sử dụng bộ nhớ trở nên khá cao hoặc thông lượng đĩa tăng vọt.

Đó không phải là phần cứng tồi, với lõi tứ 2,6 GHz và RAM DDR2 800 MHz (sẽ có 6GB, nhưng do không tương thích phần cứng nên không thể trộn lẫn với bộ cũ). Vấn đề này có thể biến mất khi tôi không thể có thêm RAM, nhưng tôi không cảm thấy đó là vấn đề cốt lõi. Tôi thậm chí có hai phân vùng trao đổi trên các đĩa khác nhau.

Tôi cảm thấy vấn đề là gấp ba lần:

  • các chương trình chạy trốn chiếm số lượng lớn bộ nhớ - luật phải được đặt ra cho các chương trình này, với các giới hạn đối với chúng
    • (ví dụ: các tab trên Chrome, mỗi tab có dung lượng 20-50 MB, một số có thể sử dụng hàng trăm MB)
    • (ví dụ: các chương trình khác như update-db và bộ chỉ mục mà tôi đã phải vô hiệu hóa và xóa khỏi cron vì chúng làm chậm hệ thống để thu thập thông tin bất cứ khi nào chúng chạy, v.v.)
  • một cái gì đó khủng khiếp xảy ra trong một cuộc tranh chấp hạt nhân hoặc xe buýt nào đó, chẳng hạn như các tình huống thông lượng đĩa cao làm chậm toàn bộ hệ thống để thu thập dữ liệu (có lẽ bằng cách phân trang các chương trình quan trọng)
  • kernel không ưu tiên UI hoặc các chương trình quan trọng về tài nguyên, như bộ nhớ, phân trang, thậm chí sử dụng bộ xử lý

Upvote đi đến:

Vì vậy, tôi đang tìm kiếm một giải pháp mà tất cả các chương trình như vậy biến mất. Cụ thể, tôi đang tìm kiếm một giải pháp sao cho các quy trình sẽ chậm lại theo tỷ lệ, trong khi hệ thống và các chương trình khác vẫn hoàn toàn không bị ảnh hưởng và đáp ứng đủ lâu để giết một cách thủ công. Ngoài ra, quy trình quản lý cửa sổ (và bất kỳ điều gì khác có thể ảnh hưởng đến phản ứng của UI) phải được đáp ứng trong mọi trường hợp.

Đặc biệt tôi bị hấp dẫn bởi /etc/security/limits.conf( man limits.conf), nhưng tôi lo lắng điều này chỉ mang lại quyền kiểm soát cho mỗi người dùng và các ví dụ nhận xét trong tệp có vẻ khá mờ về mặt mô tả hoặc bắt đầu từ đâu. Tôi hy vọng rằng một limits.conftác phẩm, nhưng sẽ không ngạc nhiên nếu nó thậm chí không hoạt động, hoặc nếu nó không phải là một giải pháp thích hợp cho vấn đề của tôi, hoặc chi tiết như tôi đang cố gắng đạt được. Một tên cho mỗi quá trình limits.confsẽ là lý tưởng, giả sử một lần nữa rằng giới hạn. Tôi rất vui khi dùng thử giới hạn. Thông tin mà mọi người cung cấp, để kiểm tra xem nó có hoạt động không, mặc dù tôi sẵn sàng cho tất cả các giải pháp tại thời điểm này.

Cũng có thể hữu ích khi có bất kỳ hiểu biết nào về cách OS X quản lý để theo kịp phản ứng UI tốt như vậy.

Tôi đã điều chỉnh /tmpcác thư mục bộ nhớ cache và bộ nhớ cache của mình để bật tmpfsvà trong sử dụng đĩa nói chung là gần như bằng không.

Các chủ đề liên quan đến mơ hồ:

  • bộ nhớ quá mức

Câu trả lời tôi không nghĩ sẽ hoạt động:

  • swapoff .
  • echo ?? > /sys/.../swappiness (không có tác dụng rõ rệt)
  • nice (chưa bao giờ làm việc)
  • ionice (không bao giờ nhận thấy một sự khác biệt)
  • selinux (chương trình không tương thích dường như là một cơn ác mộng)
  • linux thời gian thực, tức là có thể làm gián đoạn kernel (không muốn xử lý biên dịch và cập nhật kernel tùy chỉnh; có thể ổn nếu nó đã được di chuyển vào kho lưu trữ)
  • *

hmm, tôi dường như không thể đặt tiền thưởng; Tôi đoán liên kết không xuất hiện trong 48 giờ? ... Tôi sẽ đăng tiền thưởng với tất cả danh tiếng mà tôi đã có được sau đó
user76871

1
+1, đây là vấn đề lớn nhất tôi gặp phải với máy tính để bàn Linux trên cơ sở hàng ngày. Tôi thỉnh thoảng bị đóng băng, có lẽ vài tuần một lần, nhưng những điều đó thường không đủ để gây khó chịu đặc biệt. Tuy nhiên, nó dường như chỉ là một vấn đề với các ứng dụng, như bạn đã nói, việc sử dụng IO nặng : Các ứng dụng sử dụng CPU nặng hầu như không ảnh hưởng đến hiệu năng hệ thống nói chung. Không biết về ionice, có vẻ như đó sẽ là giải pháp chính xác cho vấn đề này nếu nó hoạt động tốt.
crazy2be

1
3 năm sau và đây vẫn là một vấn đề trên Linux. @ crazy2be hoặc user76871, tôi không cho rằng bạn đã tìm thấy giải pháp trong lúc này?
Glutimate

@Glutanimate: có, 32GB RAM vật lý và không ít hơn (tốt, có thể là 16GB ... nhưng điều đó đang đẩy nó), cũng là một lượng lớn RAM video. Điều này không khắc phục sự không phản hồi do CPU cao hoặc bị gián đoạn hoặc không có gì, nhưng nó ngăn chặn sự không phản hồi trong các tình huống bộ nhớ thấp.
dùng76871

Câu trả lời:


6

Âm thanh như hệ thống của bạn đi vào trao đổi nặng. Việc sử dụng vmstat 1có thể tiết lộ một số chi tiết - chỉ cần để nó chạy trong cửa sổ đầu cuối và chuyển sang trạng thái chậm khi khởi động chậm.

Thay vì đặt / tmp và "cache" vào tmpfs, tôi sẽ sử dụng một hệ thống tập tin đĩa bình thường được gắn với noatimetùy chọn. Dữ liệu thường được sử dụng sẽ vẫn ở trong bộ nhớ cache và dữ liệu cũ hơn có thể được ghi vào đĩa để giải phóng một số RAM cho các ứng dụng. Nếu / tmp và / hoặc bộ đệm phát triển lớn hơn, điều này có thể giúp ích rất nhiều.


1
+1 để đề cập noatime.
LawrenceC

Cảm ơn bạn đã đề cập noatime, thật không may, tôi đã từng sử dụng tùy chọn gắn kết đó và tôi không nghĩ rằng nó giúp ích nhiều cho việc đảm bảo khả năng phản hồi (mặc dù nó giúp rất nhiều để đảm bảo đĩa không hoạt động quá mức); chỉ để chắc chắn rằng tôi đã kích hoạt lại noatime trên thiết lập hiện tại của mình. Mặc dù có một phi-tmpfs với noatime có vẻ hơi lạ, vì tôi vẫn tưởng tượng những bài viết lớn phải xảy ra.
dùng76871

+1, đã thử vmstat 1- cực kỳ hữu ích trong chẩn đoán xác thực rằng việc hoán đổi là trên thực tế, một phần lớn của vấn đề chính
user76871

2
Ôi. Chưa bao giờ thấy một hệ thống linux cần trao đổi nặng như vậy. Bạn đã kiểm tra với df -mbao nhiêu bộ nhớ được sử dụng hết trong các hệ thống tập tin tmpfs chưa? Một cái gì đó đang ăn RAM của bạn tương đối nhanh.
Turbo J

cảm ơn vì lời đề nghị và dạy tôi về -mlựa chọn này Thật không may, df -h -mdường như chỉ ra 100 MB bộ nhớ của tôi tmpfs, vì vậy tôi nghi ngờ nó có liên quan gì đến việc sử dụng bộ nhớ cho tmpfs và cache không. Điều này cũng không có vẻ là không phổ biến; Tôi đã có nó xảy ra trên nhiều bản phân phối khi RAM của chúng được đẩy đến gần giới hạn.
user76871

5

Tôi không phải là nhà phát triển hạt nhân nhưng tôi đã dành nhiều năm để triết lý về vấn đề này bởi vì tôi đã gặp phải vấn đề này rất nhiều lần. Tôi thực sự đã đưa ra một phép ẩn dụ cho toàn bộ tình huống vì vậy hãy để tôi nói với bạn điều đó. Tôi sẽ cho rằng trong câu chuyện của mình rằng những thứ như "hoán đổi" không tồn tại. Hoán đổi không có ý nghĩa nhiều với RAM 32 GB dù sao đi nữa.

Hãy tưởng tượng một khu phố của bạn, nơi nước được kết nối với mỗi tòa nhà thông qua các đường ống và thị trấn cần quản lý công suất. Giả sử rằng bạn chỉ sản xuất 100 đơn vị nước mỗi giây (và tất cả công suất không sử dụng sẽ bị lãng phí vì bạn không có bể chứa). Mỗi nhà (nhà = một ứng dụng nhỏ, thiết bị đầu cuối, tiện ích đồng hồ, v.v.) yêu cầu 1 đơn vị nước mỗi giây. Điều này là tốt và tốt vì dân số của bạn là 90, vì vậy mọi người đều có đủ nước.

Bây giờ thị trưởng (= bạn) quyết định rằng bạn muốn mở một nhà hàng lớn (= trình duyệt). Nhà hàng này sẽ chứa nhiều đầu bếp (= tab trình duyệt). Mỗi đầu bếp cần 1 đơn vị nước mỗi giây. Bạn bắt đầu với 10 đầu bếp, vì vậy tổng lượng nước tiêu thụ cho cả khu phố là 100 đơn vị nước vẫn còn tốt.

Bây giờ công cụ thú vị bắt đầu: bạn thuê một đầu bếp khác vào nhà hàng của bạn, điều này làm cho tổng nhu cầu nước 101 mà rõ ràng là bạn không có. Bạn cần phải làm một cái gì đó.

Quản lý nước (= kernel) có 3 tùy chọn.

1. Tùy chọn đầu tiên chỉ là ngắt kết nối dịch vụ cho những ngôi nhà không sử dụng nước gần đây. Điều này là tốt nhưng nếu nhà bị ngắt kết nối muốn sử dụng nước một lần nữa, họ sẽ cần phải trải qua quá trình đăng ký dài. Ban quản lý có thể ngắt kết nối nhiều ngôi nhà để giải phóng nhiều nguồn nước hơn. Trên thực tế, họ sẽ ngắt kết nối tất cả các ngôi nhà gần đây không sử dụng nước, do đó luôn có sẵn một lượng nước miễn phí.

Mặc dù thị trấn của bạn tiếp tục hoạt động, nhưng nhược điểm là sự tiến bộ bị đình trệ. Hầu hết thời gian của bạn dành cho việc chờ đợi vào quản lý nước để phục hồi dịch vụ của bạn.

Đây là những gì kernel làm với các trang được hỗ trợ tập tin. Nếu bạn chạy một tệp thực thi lớn (như chrome), tệp của nó sẽ được sao chép bộ nhớ. Khi bộ nhớ còn thấp hoặc nếu có những phần không được truy cập gần đây, kernel sẽ có thể loại bỏ những phần đó vì nó có thể tải lại chúng từ đĩa. Nếu điều này được thực hiện quá mức, điều này sẽ khiến máy tính của bạn tạm dừng vì mọi thứ sẽ chỉ chờ vào đĩa IO. Lưu ý rằng kernel cũng sẽ bỏ rất nhiều trang được sử dụng gần đây nhất khi bạn bắt đầu thực hiện nhiều IO. Đây là lý do tại sao phải mất nhiều thời gian để chuyển sang ứng dụng nền sau khi bạn sao chép một số tệp lớn như hình ảnh DVD.

Đây là hành vi khó chịu nhất đối với tôi vì tôi ghét những kẻ hèn nhát và bạn không có quyền kiểm soát nào đối với nó. Nó sẽ là tốt đẹp để có thể tắt nó. Tôi đang nghĩ về một cái gì đó dọc theo dòng

sed -i 's/may_unmap = 1/may_unmap = (vm_swappiness >= 0)/' mm/vmscan.c

và sau đó bạn có thể đặt vm_swappiness thành -1 để tắt tính năng này. Điều này hoạt động khá tốt trong các thử nghiệm nhỏ của tôi nhưng than ôi tôi không phải là nhà phát triển hạt nhân nên tôi đã không gửi nó cho bất kỳ ai (và rõ ràng là sửa đổi nhỏ ở trên chưa hoàn tất).

2.Ban quản lý có thể từ chối yêu cầu của người đầu bếp mới về nước. Điều này ban đầu nghe có vẻ là một ý tưởng tốt. Tuy nhiên có hai nhược điểm. Đầu tiên, có những công ty yêu cầu rất nhiều thuê bao nước mặc dù họ không sử dụng chúng. Một lý do có thể để làm điều này là để tránh tất cả các chi phí nói chuyện với quản lý nước bất cứ khi nào họ cần thêm nước. Việc sử dụng nước của họ tăng lên và giảm xuống tùy thuộc vào thời gian trong ngày. Ví dụ, trong trường hợp của nhà hàng, công ty cần nhiều nước hơn vào buổi trưa so với nửa đêm. Vì vậy, họ yêu cầu tất cả nước có thể họ có thể sử dụng nhưng điều đó làm lãng phí việc phân bổ nước trong nửa đêm. Vấn đề là không phải tất cả các công ty đều có thể thấy trước mức sử dụng tối đa của họ một cách chính xác nên họ yêu cầu nhiều hơn nữa với hy vọng họ sẽ không bao giờ phải lo lắng về việc yêu cầu thêm.

Đây là những gì máy ảo của Java thực hiện: nó phân bổ một loạt bộ nhớ khi khởi động và sau đó hoạt động từ đó. Theo mặc định, kernel sẽ chỉ phân bổ bộ nhớ khi ứng dụng Java của bạn thực sự bắt đầu sử dụng nó. Tuy nhiên, nếu bạn vô hiệu hóa quá mức, kernel sẽ nghiêm túc đặt phòng. Nó sẽ chỉ cho phép phân bổ thành công nếu nó thực sự có tài nguyên cho nó.

Tuy nhiên, có một vấn đề khác nghiêm trọng hơn với phương pháp này. Giả sử một công ty bắt đầu yêu cầu một đơn vị nước mỗi ngày (thay vì theo các bước 10). Cuối cùng, bạn sẽ đạt đến trạng thái có 0 đơn vị miễn phí. Bây giờ công ty này sẽ không thể phân bổ nhiều hơn. Điều đó tốt, dù sao cũng quan tâm đến các công ty lớn. Nhưng vấn đề là những ngôi nhà nhỏ cũng sẽ không thể yêu cầu nhiều nước hơn! Bạn sẽ không thể xây dựng phòng tắm công cộng nhỏ để đối phó với lượng khách du lịch đột ngột. Bạn sẽ không thể cung cấp nước khẩn cấp cho đám cháy trong khu rừng gần đó.

Về mặt máy tính: Trong các tình huống bộ nhớ rất thấp mà không có vấn đề gì quá mức, bạn sẽ không thể mở một xterm mới, bạn sẽ không thể ssh vào máy của mình, bạn sẽ không thể mở một tab mới để tìm kiếm có thể sửa lỗi. Nói cách khác, vô hiệu hóa overcommit cũng làm cho máy tính để bàn của bạn trở nên vô dụng khi thiếu bộ nhớ.

3. Bây giờ đây là một cách thú vị để xử lý vấn đề khi một công ty bắt đầu sử dụng quá nhiều nước. Việc quản lý nước thổi nó lên! Theo nghĩa đen: nó đi đến trang web của nhà hàng, ném thuốc nổ vào đó và đợi cho đến khi nó nổ tung. Điều này sẽ giảm ngay lập tức nhu cầu nước của thị trấn xuống rất nhiều để những người mới có thể chuyển đến, bạn có thể tạo phòng tắm công cộng, v.v. Bạn, với tư cách là thị trưởng, có thể xây dựng lại nhà hàng với hy vọng rằng lần này sẽ cần ít nước hơn. Ví dụ, bạn sẽ bảo mọi người không vào nhà hàng nếu có quá nhiều người bên trong (ví dụ: bạn sẽ mở ít tab trình duyệt hơn).

Đây thực sự là những gì kernel làm khi hết tất cả các tùy chọn và nó cần bộ nhớ: nó gọi là kẻ giết người OOM. Nó chọn một ứng dụng lớn (dựa trên nhiều phương pháp phỏng đoán) và giết chết nó, giải phóng một loạt bộ nhớ nhưng vẫn duy trì một máy tính để bàn đáp ứng. Trên thực tế, kernel Android thực hiện điều này thậm chí còn mạnh mẽ hơn: nó giết chết ứng dụng ít được sử dụng gần đây nhất khi bộ nhớ còn thấp (so với kernel stock chỉ làm như một phương sách cuối cùng). Đây được gọi là Viking Killer trong Android.

Tôi nghĩ rằng đây là một trong những giải pháp đơn giản nhất cho vấn đề: không phải là bạn có nhiều lựa chọn hơn thế này, vậy tại sao không vượt qua nó sớm hơn, phải không? Vấn đề là nhân đôi khi thực hiện khá nhiều công việc để tránh gọi kẻ giết OOM. Đó là lý do tại sao bạn thấy rằng máy tính để bàn của bạn rất chậm và kernel không làm gì với nó. Nhưng may mắn thay, có một lựa chọn để tự mình gọi kẻ giết người OOM! Trước tiên, hãy đảm bảo khóa sysrq ma thuật được bật (ví dụ echo 1 | sudo tee /proc/sys/kernel/sysrq) sau đó bất cứ khi nào bạn cảm thấy hạt nhân sắp hết bộ nhớ, chỉ cần nhấn Alt + SysRQ, Alt + f.

OK vậy tất cả đều tốt nhưng bạn muốn dùng thử? Tình huống bộ nhớ thấp rất đơn giản để tái tạo. Tôi có một ứng dụng rất đơn giản cho việc đó. Bạn sẽ cần phải chạy nó hai lần. Lần chạy đầu tiên sẽ xác định bạn có bao nhiêu RAM miễn phí, lần chạy thứ hai sẽ tạo ra tình trạng bộ nhớ thấp. Lưu ý rằng phương pháp này giả định rằng bạn đã vô hiệu hóa trao đổi (ví dụ: a sudo swapoff -a). Mã và cách sử dụng như sau:

// gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int limit = 123456789;
    if (argc >= 2) {
        limit = atoi(argv[1]);
    }
    setbuf(stdout, NULL);
    for (int i = 1; i <= limit; i++) {
        memset(malloc(1 << 20), 1, 1 << 20);
        printf("\rAllocated %5d MiB.", i);
    }
    sleep(10000);
    return 0;
}

Và đây là cách bạn sử dụng nó:

$ gcc -std=c99 -Wall -Wextra -Werror -g -o eatmem eatmem.c
$ ./eatmem
Allocated 31118 MiB.Killed
$ ./eatmem 31110
Allocated 31110 MiB.Killed

Yêu cầu đầu tiên phát hiện ra rằng chúng ta có 31.118 MiB RAM miễn phí. Vì vậy, tôi đã nói với ứng dụng phân bổ 31.110 RAM MiB để kernel không giết nó mà ăn gần hết bộ nhớ của tôi. Hệ thống của tôi đóng băng: ngay cả con trỏ chuột cũng không nhúc nhích. Tôi đã nhấn Alt + SysRQ, Alt + f và nó đã giết quá trình eatmem của tôi và hệ thống đã được khôi phục.

Mặc dù chúng tôi đã đề cập đến các lựa chọn của mình trong tình huống bộ nhớ thấp, cách tiếp cận tốt nhất (giống như bất kỳ tình huống nguy hiểm nào khác) là tránh nó ngay từ đầu. Có rất nhiều cách để làm điều này. Một cách phổ biến mà tôi đã thấy là đặt các ứng dụng hoạt động sai (như trình duyệt) vào các thùng chứa khác với các phần còn lại của hệ thống. Trong trường hợp đó, trình duyệt sẽ không thể ảnh hưởng đến máy tính để bàn của bạn. Nhưng bản thân việc phòng ngừa nằm ngoài phạm vi câu hỏi nên tôi sẽ không viết về nó.

TL; DR: Mặc dù hiện tại không có cách nào để tránh hoàn toàn việc phân trang, bạn có thể giảm thiểu toàn bộ hệ thống bằng cách vô hiệu hóa quá mức. Nhưng hệ thống của bạn sẽ vẫn không sử dụng được trong tình huống bộ nhớ thấp nhưng theo một cách khác. Bất kể ở trên, trong tình huống bộ nhớ thấp, nhấn Alt + SysRQ, Alt + f để giết một quá trình lớn trong lựa chọn của kernel. Hệ thống của bạn sẽ khôi phục khả năng phản hồi sau vài giây. Điều này giả định rằng bạn đã bật khóa sysrq ma thuật (nó không phải mặc định).


Tôi đã cho bạn tất cả danh tiếng của tôi như là tiền thưởng cho tài nguyên này, vì vậy tôi thậm chí không thể để lại nhận xét :) Cuối cùng, tôi đã kiếm được một số để nói lời cảm ơn vì câu trả lời tuyệt vời này! Tôi đã phải đối phó với vấn đề này suốt thời gian tôi có máy tính xách tay với 8GB (thật điên rồ, nhưng hệ thống của tôi thường xuyên bị hết bộ nhớ). Gần đây, tôi tìm thấy dự án này: github.com/rfjakob/earlyoom , có thể giúp ngăn hệ thống treo bằng cách giết một số quy trình trước khi quá muộn.
Vlad Frolov

4

Đặt tất cả các tệp tạm thời và bộ nhớ cache của bạn vào tmpfssẽ làm giảm dung lượng RAM miễn phí mà bạn có, do đó bạn có thể khiến hệ thống chuyển đổi sớm hơn mức cần thiết nếu không có điều này.

Có vẻ như bạn có một số ứng dụng đang dựa vào một số loại trình điều khiển hoặc trình điều khiển hạt nhân đang bị quá tải. Bạn không đi sâu vào chi tiết về loại ứng dụng nào khác ngoài việc bạn đang sử dụng trình duyệt và bộ chỉ mục và bạn đã vô hiệu hóa bộ chỉ mục.

Bạn có thể thử chuyển sang môi trường máy tính để bàn hoặc trình quản lý cửa sổ tiêu tốn ít tài nguyên hơn, chẳng hạn như LXDE hoặc IceWM. Trong công việc, tôi sử dụng hệ thống Linux có cài đặt LXDE và ROX-Filer cho môi trường máy tính để bàn rất tối thiểu. Mục đích của hệ thống Linux này là chạy VMWare Player để tôi có thể chạy Windows XP và Windows 7 cùng một lúc. Đó là thông số kỹ thuật phần cứng tương tự như những gì bạn nói và tôi không có quá nhiều vấn đề về khả năng đáp ứng dưới tải nặng này Tôi đang đặt phần cứng. Tôi không có bất kỳ vấn đề phản hồi nào với bản thân Linux (thường là các máy ảo đôi khi khiến tôi phải chờ một giây và chia sẻ 1 đĩa giữa 2 máy ảo + 1 hệ điều hành như mong đợi) và luôn có thể tạm dừng hoặc tắt máy ảo bất cứ khi nào Tôi muốn.

Vì vậy, với tôi nó chỉ ra một số vấn đề với các ứng dụng cụ thể bạn đang chạy.

DMA có được kích hoạt cho các ổ đĩa của bạn không? (sử dụng hdparm) Nếu bạn đang sử dụng mã hóa toàn bộ đĩa, điều đó đòi hỏi tất cả lưu lượng đĩa phải đi qua CPU, điều này phủ nhận phần lớn lợi ích của DMA. Ảnh hưởng của điều đó là lưu lượng đĩa cao sẽ khiến CPU tăng đột biến, sau đó sẽ làm chậm toàn bộ hệ thống. (EDIT: để làm rõ, việc tắt DMA HOẶC sử dụng dm-cryptsẽ gây ra CPU cao trong khi lưu lượng đĩa cao)


2
Vấn đề của câu hỏi không phải là WM bị cồng kềnh và khiến hệ thống trở nên chậm chạp (nó có khả năng đáp ứng hoàn hảo trong sử dụng bình thường), mà là kernel không ưu tiên đúng các ứng dụng khi hết bộ nhớ và phải đi vào bộ nhớ tráo đổi nặng nề. Tôi đã gặp sự cố này trên mọi máy tính để bàn Linux mà tôi đã từng sử dụng và trong khi sử dụng các chương trình nhẹ hơn hoặc thêm nhiều ram có thể giúp ích, nó không giải quyết được gốc rễ của vấn đề.
crazy2be

Trong bài viết trước tôi đã nói như sau: "Có vẻ như bạn có một số ứng dụng đang dựa vào một loại trình điều khiển hoặc trình điều khiển hạt nhân nào đó đang bị quá tải." Vì vậy, có thể nút cổ chai nằm trong một mô-đun hạt nhân cụ thể. Tôi không phải là chuyên gia về kernel, nhưng tôi chắc chắn rằng việc cấp phát bộ nhớ từ phía kernel, đặc biệt là phía module, hoạt động khác với phía userland. Việc sử dụng CPU ở phía kernel cũng có khả năng được xử lý khác nhau (không biết bạn có thể "xử lý" tốt các tiến trình kernel hay không). Tôi không thể bình luận thêm mà không biết các ứng dụng cụ thể liên quan.
LawrenceC

Ngoài ra nếu bạn đang sử dụng FUSE NTFS có thể gây chậm.
LawrenceC

1
Tôi biết rằng một hệ thống tệp dựa trên RAM như tmpfs (rõ ràng) làm cho RAM hết nhanh hơn và WM nhẹ có thể làm giảm nhẹ các triệu chứng của vấn đề tiềm ẩn. Tôi cảm thấy áp lực khi sử dụng tmpfs do khả năng phản hồi kém vào đĩa có thể gây ra. Tuy nhiên, cảm ơn bạn đã gợi ý, đặc biệt là phần về DMA, mà tôi đã thêm vào danh sách các chủ đề có thể liên quan. Đối với bản ghi, tôi tin rằng DMA đã được bật và tôi không sử dụng hệ thống tệp mã hóa.
dùng76871

1

Đây là một vấn đề phổ biến với bộ lập lịch của Linux. Hệ thống chậm lại để thu thập thông tin bất cứ khi nào hoạt động nặng IO xảy ra. Thực sự không có nhiều điều bạn có thể làm để cải thiện tình hình trừ khi bạn bị hack kernel :)

Có lẽ những điều này có thể giúp:

http://www.phoronix.com/scan.php?page=article&item=linux_2637_video&num=1

http://www.osnews.com/story/24223/Alternative_to_the_200_Lines_Kernel_Patch_that_Does_Wondftime


1
Như tôi nhớ lại, các bản vá nhân đó thực sự chỉ có liên quan nếu bạn đang biên dịch chương trình hoặc làm một cái gì đó rất nặng CPU (và IO?) Trong một thiết bị đầu cuối , trong khi cố gắng tương tác với các ứng dụng GUI. Thật không có ích trong trường hợp phổ biến hơn khi một ứng dụng GUI đang thực hiện một số công việc nặng và bạn đang cố gắng làm việc với một ứng dụng GUI khác, thật không may.
crazy2be

0

Mặc dù câu hỏi đã hơn hai năm tuổi và câu trả lời của @ ypsu rất hay, tình huống với các hệ thống dựa trên Linux trở nên tồi tệ do thiếu RAM vẫn còn ở đây.

Đây là quan sát của tôi về vấn đề: ngay cả khi tôi không có trao đổi gì cả, một khi hệ thống bị thiếu bộ nhớ, đèn báo ổ cứng của tôi sẽ sáng vì nó tải 100% đĩa. Với thực tế này, có vẻ như nguyên nhân gốc rễ là hạt nhân cố gắng giải phóng bộ nhớ bằng cách dỡ bỏ thứ gì đó có thể được khôi phục từ đĩa, và đó, chắc chắn là các thư viện chia sẻ. Vì các ứng dụng GUI thường có hàng tấn thư viện dùng chung, nên dường như hệ thống có thể nghĩ rằng chỉ cần dỡ một số trong số chúng, nhưng nó chỉ hoạt động cho đến khi hoạt động không gian người dùng tiếp theo yêu cầu các thư viện không tải đó quay trở lại. Đây dường như là kịch bản có khả năng nhất gây ra vòng lặp vô tận của việc dỡ tải các thư viện chia sẻ và tải chúng trở lại.

Có một dự án hoạt động như một trình nền không gian người dùng giết chết các tiến trình ngốn nhiều bộ nhớ nhất trước khi quá muộn: https://github.com/rfjakob/earlyoom

Ngoài ra, tôi thường sử dụng các bộ chứa Docker với giới hạn bộ nhớ lành mạnh cho các ứng dụng ngốn bộ nhớ (ví dụ: Chrome).

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.