Cách thiết lập zram và trao đổi đúng cách


9

Tôi đang cấu hình và biên dịch kernel 3.0 mới. Một trong những tính năng tôi dự định sử dụng trong một thời gian (bằng cách vá) đã được sáp nhập vào 3.0 là zram.

Có thể đặt cả hoán đổi hdd và hoán đổi zram để zram được sử dụng trước và chỉ các trang bị đổ mới được đưa vào trao đổi thực tế?

Câu trả lời:


8

Sidenote: vì khóa per-cpu, điều quan trọng là phải có nhiều lần hoán đổi zram như CPU (modprobe zram_num_devices = n zram) thay vì một lần lớn. RTFM!


1
[cần dẫn nguồn]? Tôi không thể tìm thấy giới thiệu trong tài liệu Linux hoặc Google.
Maciej Piechotka

Theo mặc định max_comp_streamsdường như là 1theo tài liệu . Tôi đã không kiểm tra nếu tham số đó tồn tại vào năm 2011 nhưng có vẻ như đó là một lựa chọn tốt hơn sau đó nhiều tệp hoán đổi.
Maciej Piechotka

1
Thử nghiệm với gói zram-configtrong Ubuntu (và có khả năng là debian) Tôi lưu ý rằng cấu hình mặc định là 1 trên mỗi lõi hoặc luồng (2 trên lõi kép E2140 cũ và 4 trên i3-3220)
Elder Geek

thú vị, và điều này cũng có vẻ khá rõ ràng để hiểu bằng cách đọc /etc/init/zram-config.conf
Sức mạnh Bảo Bình

1
Sidenote này đã lỗi thời kể từ phiên bản kernel 3.15. Bây giờ bạn có thể có nhiều luồng nén cho một zram lớn.
Perkins

6

swapon-pcông tắc đặt mức độ ưu tiên. Tôi có thể thiết lập:

swapon -p 32767 /dev/zram0
swapon -p 0 /dev/my-lvm-volume/swap

Hoặc trong / etc / fstab:

/dev/zram0              none swap sw,pri=32767 0 0
/dev/my-lvm-volume/swap none swap sw,pri=0     0 0

EDIT: Chỉ cho một giải pháp đầy đủ - dòng như vậy có thể hữu ích như quy tắc udev:

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"

1

Chọn số lượng thiết bị zram bạn muốn bằng cách vượt qua

zram.num_devices=4

đến các tham số kernel hoặc trực tiếp đến mô-đun (không có zram.). Giá trị mặc định là 1. zram sẽ có thể sử dụng nhiều cpus như số lượng thiết bị bạn tạo.

Chuẩn bị thiết bị zram0, đặt kích thước thành 1GB.

echo 1000000000 > /sys/block/zram0/disksize

Ngoài ra, bạn có thể làm điều đó theo quy tắc udev. Tạo trao đổi trên zram0

mkswap /dev/zram0

và kích hoạt nó với mức độ ưu tiên cao hơn các thiết bị trao đổi khác

swapon -p 32767 /dev/zram0

Phiên bản kernel và distro nào bạn đang viết cho đây?
Cbhihe

Đối với bản ghi, tiến hành như bạn khuyên trên Ubuntu máy tính để bàn 14.04.5, không thành công. Đặc biệt, khi tôi cố gắng đặt mức độ ưu tiên zram0zram1giá trị 10 trên hộp Intel T9300 2 nhân, nó sẽ ném cho tôi : swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe

1

Vì một số lý do, dường như có rất nhiều giải thích sai về https://www.kernel.org/doc/Documentation/blockdev/zram.txt

Nó nêu rõ:

2) Đặt số lượng luồng nén tối đa
Bất kể giá trị được truyền cho thuộc tính này, ZRAM sẽ luôn phân bổ nhiều luồng nén - một luồng cho mỗi CPU trực tuyến - do đó cho phép một số hoạt động nén đồng thời. Số lượng luồng nén được phân bổ giảm xuống khi một số CPU trở nên ngoại tuyến. Không còn chế độ một luồng nén nữa, trừ khi bạn đang chạy hệ thống UP hoặc chỉ có 1 CPU trực tuyến.

Để tìm hiểu có bao nhiêu luồng hiện có sẵn:

cat /sys/block/zram0/max_comp_streams

Nhưng có một truyền thuyết đô thị phổ biến, dai dẳng rằng luồng tối đa là 1.

Rõ ràng là không đúng.

Hai hệ điều hành trong đó zram đã chứng minh Chrome OS và Android hiệu quả cho bạn một thiết bị duy nhất. Ngoài ra họ tinh chỉnh page-cluster:

page-clusterkiểm soát số lượng trang mà các trang liên tiếp được đọc từ trao đổi trong một lần thử. Đây là đối tác trao đổi để đọc bộ nhớ cache trang.
Liên tiếp được đề cập không phải là về địa chỉ ảo / vật lý, mà liên tiếp trên không gian hoán đổi - điều đó có nghĩa là chúng được hoán đổi với nhau.

Đó là một giá trị logarit - đặt nó thành 0 có nghĩa là "1 trang", đặt nó thành 1 có nghĩa là "2 trang", đặt nó thành 2 có nghĩa là "4 trang", v.v ... Không vô hiệu hóa hoàn toàn trao đổi đọc.

Giá trị mặc định là ba (tám trang cùng một lúc). Có thể có một số lợi ích nhỏ trong việc điều chỉnh giá trị này thành một giá trị khác nếu khối lượng công việc của bạn là trao đổi nhiều.

Giá trị thấp hơn có nghĩa là độ trễ thấp hơn cho các lỗi ban đầu, nhưng đồng thời các lỗi thêm và độ trễ I / O cho các lỗi sau nếu chúng là một phần của các trang liên tiếp mà readahead sẽ đưa vào.

                - từ tài liệu kernel cho/proc/sys/vm/*

Vì vậy, sử dụng echo "0" > /proc/sys/vm/page-clusterđể buộc trang duy nhất.

Dường như phần lớn bắt nguồn từ zram_config gói debian / ub Ubuntu vì lý do nào đó dường như có rất ít mối tương quan với các tài liệu kernel cho zram và đã tạo ra một loạt các lời thì thầm của Trung Quốc về bản chất có thể sai hoàn toàn.

Với trao đổi tập tin, bạn có tạo một ổ đĩa trao đổi cho mỗi lõi? Có lẽ điều đó có thể trả lời câu hỏi của bạn. Ngoài ra, để sao lưu điều này, Google Googles Chrome OS và Android sử dụng thành công với cụm trang ở trên vì nó không khớp với đĩa nên độ trễ có thể được cải thiện, các thiết bị đơn lẻ.

Ngoài ra đối với một sys-admin, việc sử dụng mem thực tế hay sử dụng mem vm là gì? Hầu hết các ví dụ cho thấy việc tạo thông qua đĩa_size và hoàn toàn bỏ qua mem_limit. đĩa_size = kích thước vm không nén. mem_limit = giới hạn dấu chân mem thực tế.

Nó khiến cho sự lựa chọn của đĩa_size trở nên khó hiểu vì kích thước tối đa ảo của nó phụ thuộc vào tỷ lệ comp_ache và chi phí 0,1% kích thước của đĩa khi không sử dụng và thực sự là một dự đoán của mem_limit * (khoảng 2 - 4) so ​​với lạc quan.

zram_config thậm chí không kiểm tra việc sử dụng dịch vụ trước đó và ghi đè trong khi kiểm tra đơn giản lớp zram sys như dưới đây.

createZramSwaps () {
        totalmem=$(free|awk '/^Mem:/{print $2}')
        mem=$((( totalmem * MEM_FACTOR / 100 / BIG_CORES ) * 1024))

        # Check Zram Class created
        ZRAM_SYS_DIR='/sys/class/zram-control'
        if [ ! -d "${ZRAM_SYS_DIR}" ]; then
                modprobe zram
                RAM_DEV='0'
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        else
                RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        fi

        if [ "$BIG_CORES" -gt 1 ];then
                for i in $(seq $((BIG_CORES - 1))); do
                        RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                        echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                        echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                        mkswap /dev/zram${RAM_DEV}
                        swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
                done
        fi
}

0

Khi bạn kích hoạt zram, nó sẽ tự động được ưu tiên.

Đối với Ubuntu 16.04: /usr/bin/init-zram-swapping

Bạn có thể chỉnh sửa tệp đó (tạo bản sao lưu thứ 1), để hạ thấp ram thực đã sử dụng, tôi đã thay đổi dòng mem thành này:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
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.