Loại bỏ nền trên các phân vùng trao đổi trên Linux + SSD


11

Vấn đề

Tôi muốn kích hoạt các hoạt động TRIM nền trên phân vùng trao đổi trong đĩa SSD trên Linux. Theo một số bài viết, ví dụ như bài viết này , kernel phát hiện cấu hình này và tự động thực hiện các thao tác loại bỏ, nhưng trong các thử nghiệm của tôi dường như nó không hoạt động mặc dù tùy chọn gắn trên đĩa cứng được sử dụng để buộc hành vi này.

Kịch bản

  • Debian Wheezy chạy Linux 3.2.0
  • Đĩa SSD: 1 x 120GB OCZ Vertex 3 MI
  • Phân vùng 2GB trao đổi đơn giản, phân vùng, các lớp khác (LVM, RAID, v.v.)

Lý lịch

Đây là các bước tôi làm theo để kiểm tra xem TRIM nền có hoạt động trên phân vùng trao đổi không:

  1. Hỗ trợ TRIM : kiểm tra xem đĩa SSD có hỗ trợ các lệnh TRIM không và kernel gắn cờ thiết bị là không quay:

    # hdparm -I /dev/sda | grep TRIM
     * Data Set Management TRIM supported (limit 1 block)
     * Deterministic read data after TRIM
    
    # cat /sys/block/sda/queue/rotational
    0
    
  2. Hoán đổi điền vào : gắn kết phân vùng, xóa tất cả bộ đệm VM và định cấu hình Linux để hoán đổi mạnh mẽ cài đặt vm.swappiness thành 100. Sau đó, chạy một tập lệnh phân bổ tất cả bộ nhớ có sẵn và buộc kernel bắt đầu hoán đổi:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    

    Kịch bản chạy một máy chủ với bộ nhớ vật lý 32 GB + phân vùng trao đổi 2 GB và tạo một đối tượng ~ 33,8 GB trong bộ nhớ, đủ để lấp đầy tất cả bộ nhớ và bắt đầu hoán đổi. Đây là một ví dụ về một kịch bản đạt được hành vi này:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  3. Kiểm tra nội dung trao đổi : Hoán đổi hoán đổi -s Cho thấy 100% bộ nhớ trao đổi được sử dụng. Bằng cách sử dụng hdparm --read-sector, tôi kiểm tra nội dung thô của các phân vùng trao đổi và tất cả các byte được đặt thành 1 4141, ký hiệu thập lục phân tương ứng cho ký tự của A A, mọi thứ hoạt động như mong đợi. Đây là một kịch bản ví dụ để đọc từng khu vực nội dung của phân vùng trao đổi:

    #!/bin/bash
    
    for sector in `seq 194560 4100095` ; do
        hdparm --read-sector $sector /dev/sda
    done
    

LƯU Ý: bạn có thể lấy khu vực bắt đầu / kết thúc của phân vùng trao đổi bằng cách sử dụng parted, cfdisk, v.v.

Khi tôi dừng tập lệnh, nó sẽ giải phóng tất cả bộ nhớ bao gồm cả phân bổ trao đổi, trong đó, hoán đổi hoán đổi không có giá trị trao đổi trong hệ thống. Tại thời điểm này, Linux dự kiến ​​sẽ bắt đầu loại bỏ nội dung của phân vùng trao đổi trong nền, nhưng nó không hoạt động , nội dung của các lĩnh vực vẫn là 4141, thậm chí vài giờ sau đó.

Tôi đã thực hiện một số thử nghiệm và dường như Linux chỉ thực hiện loại bỏ hoàn toàn khi phân vùng được bật bằng cách sử dụng swapon()lệnh gọi hệ thống, nhưng không bao giờ ở chế độ nền, mặc dù các tùy chọn gắn kết của chế độ loại bỏ được bật trên / etc / fstab.

Nghiên cứu thêm: blkdev_su_discard () là hàm kernel chịu trách nhiệm gửi các lệnh TRIM đến các thiết bị SSD bên dưới, có hai tham chiếu duy nhất cho chức năng này trên mm/swapfile.c:

  • discard_swap() nó được gọi trong quá trình hoán đổi (), nếu tùy chọn loại bỏ chế độ gắn kết của chế độ ăn kiêng, nó sẽ loại bỏ tất cả nội dung, điều này sẽ hoạt động như mong đợi.
  • discard_swap_cluster() cần loại bỏ nội dung của một hoán đổi cụm, nhưng dường như nó không bao giờ thực hiện lệnh TRIM.

Câu hỏi: hành vi dự kiến ​​của Linux trên các thiết bị trao đổi + SSD là gì? Nó nên loại bỏ tất cả các lĩnh vực / trang miễn phí hoặc chỉ đưa ra một loại bỏ hoàn toàn ban đầu khi phân vùng được kích hoạt trong quá trình khởi động? Cảm ơn.


4
Vấn đề ở đây là gì? RAM rất rẻ, vì bạn đang chứng minh đầy đủ bằng cách có 32 cái lớn trong máy chủ của mình. Tắt Hoán đổi, sử dụng ổ SSD của bạn cho một cái gì đó hữu ích và ngừng bitfricking về.
Tom O'Connor

3
Hoán đổi không thể bị vô hiệu hóa trên các máy chủ đó và chúng có một ổ SSD duy nhất, không có tùy chọn để lưu trữ phân vùng trao đổi trên ổ cứng truyền thống. Tôi biết rằng đặt trao đổi trên đĩa SSD không phải là lựa chọn tốt nhất, nhưng tôi đã tự hỏi liệu tôi có thể đạt được hành vi ext4 "loại bỏ" tương tự trên các phân vùng trao đổi hay không, để cải thiện hiệu suất đĩa nhiều nhất có thể.
santisaez

2
Điều này thực sự nghe giống như một trường hợp tối ưu hóa sớm.
MikeyB

"Nhận xét chỉ có thể được chỉnh sửa trong 5 phút" - phục vụ tôi ngay khi ở SF trong khi làm việc .... như tôi đã nói; @MikeyB Thật ra, tôi đã đọc về điều này. Bài viết trên wikipedia đã đề cập đến một cái gì đó tôi không biết. "Do tính chất hoạt động của bộ nhớ flash, dữ liệu không thể được ghi đè trực tiếp như có thể trong ổ đĩa cứng." Vì vậy, sẽ có nghĩa là các khối được sử dụng trước đó trong trao đổi sẽ trống .... nhưng những khối đó trông giống như "0000" khi santisaez kiểm tra nội dung trao đổi?
Tín hiệu15

Đó là tất cả xảy ra ở một lớp bên dưới hệ điều hành. Theo như HĐH, dữ liệu trên một khối sẽ ở đó cho đến khi nó được viết lại. Trách nhiệm của ổ đĩa là xử lý chu trình đọc-xóa-ghi.
MikeyB

Câu trả lời:


1

Có vẻ như Discard_swap_cluster chỉ được gọi từ scan_swap_map mà lần lượt được gọi từ get_swap_page hoặc get_swap_page_of_type . Vì vậy, nếu tôi đúng, việc loại bỏ chỉ xảy ra khi một trang trao đổi mới sẽ được phân bổ, chứ không phải khi một trang được giải phóng.


Nghe có vẻ như một lỗi.
kasperd

2
Nó có thể không phải là một lỗi. Theo cách này, linux có thể loại bỏ nhiều trang cùng một lúc thay vì thực hiện từng trang một.
lav

1

Nó có thể là hệ thống của bạn có --discard=oncemặc định. Bạn đã thử gắn kết với một tùy chọn loại bỏ cụ thể?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

và buộc như thế này:

# swapon --discard=pages /dev/sda2

Bạn cũng có thể thử tạo một fstrimdịch vụ hoặc định cấu hình dịch vụ nếu nó đã có sẵn.


-1

Khi tôi dừng tập lệnh, nó sẽ giải phóng tất cả bộ nhớ bao gồm cả phân bổ trao đổi, trong đó, hoán đổi hoán đổi không có giá trị trao đổi trong hệ thống. Tại thời điểm này, Linux dự kiến ​​sẽ bắt đầu loại bỏ nội dung của phân vùng trao đổi trong nền, nhưng nó không hoạt động , nội dung của các lĩnh vực vẫn là 4141, thậm chí vài giờ sau đó.

Nội dung của trao đổi được loại bỏ một cách hiệu quả khi swapon -strả về "không sử dụng trao đổi". Hệ thống sẽ không ghi đè lên nội dung của các khối (được điền vào w / "4141") vì đó là ổ SSD và ghi quá mức sẽ rút ngắn tuổi thọ của SSD. (Ít nhất, đó là những gì tôi lấy từ tài liệu)


5
Nếu discardtùy chọn gắn kết được sử dụng, các lệnh TRIM sẽ được gửi đến ổ đĩa trạng thái rắn bên dưới để tránh sự cố khuếch đại ghi trên đĩa SSD. Ít nhất, đây là cách mà các hệ thống tập tin khác, như ext4.
santisaez

Rõ ràng, điều đó thực sự sẽ dẫn đến việc chỉ đọc các số 0 với lệnh hdparm đó, nhưng chỉ sau khi trình thu gom rác của SSD có cơ hội chạy ..
Halfgaar
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.