ext4lazyinit의 진행 상황을 측정하는 방법이 있습니까?


17

나는 여기 ext4lazyinit에 대해 질문했다 . 내가 읽고 이해 한 모든 것에서 파일 시스템에 대한 모든 inode를 만들지 않고도 간단히 hdd를 사용할 수 있습니다.

알고 있거나 측정 할 수있는 유일한 방법은에서 모니터링하는 것 ext4lazyinit입니다 iotop. 진행률을 백분율로 얻는 방법이 있습니까?


2
확인 패치 토론
르지 Stasiak

bar [1] 또는 pv [2] 유틸리티를 사용해 보셨습니까? [1] : [ archlinux.org/packages/community/any/bar/] [2] : [ archlinux.org/packages/community/x86_64/pv/]
mattia.b89

@ mattia.b89 ext4lazyinit는 사용자 공간 프로그램이 아니며 백그라운드 커널 프로세스입니다. 정보를 위해 이것에 대한 shirish의 원래 질문을 가리키는 질문의 링크를 확인하십시오.
Austin Hemmelgarn

또한 @KrzysztofStasiak가 링크 한 패치 토론에서 Ted T'so의 평가에 동의하는 경향이 있습니다.이 작업이 완료되기를 기다려야하는 경우에는 사용하지 않아야합니다.
Austin Hemmelgarn

@KrzysztofStasiak 당신은 그것을 대답 할 수 있습니까, 나는 이것이 대답에 가장 가까운 것이라고 생각 합니다 .FWIW Ted Tso는 ext *와 동의어이므로 그의 믿음이 무엇이든, 그들은 중요합니다.
shirish

답변:


1

패치 토론을 확인하십시오 . lazyinit없이 시스템을 초기화 할 수는 있지만 측정 할 수는 없습니다. 기다릴 시간이 있으면 기다리십시오. 토론에서 패치를 시도 할 수 있지만 패치 워크에 따르면 "거부 됨"상태입니다.


1

ext4lazyinit의 진행 상황을 근사화하는 방법을 찾은 것 같습니다.

TL; DR : 아래 스크립트를 참조하십시오 .

이 방법은 파티션이 처음으로 마운트 된 이후로 디스크 연결이 끊어지지 않았으며 (또는 시스템이 다시 부팅되지 않았으며) 사용중인 파티션에 정확히 많은 양의 데이터를 기록했다고 가정합니다 (삭제 없음) 또는 파일 수정).

1 단계 : fdisk의 파티션 크기 (kiB로 변환)를 df에 표시된 1K 블록 수와 비교합니다. (파티션 크기 (kiB))에서 (1K 블록 수)를 빼서 (노드 테이블의 대략 크기) 가져옵니다.

편집 : 예, fdisk :

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

df :

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351 섹터 * 512 바이트 / 섹터 / 1024 = 5860488175.5 kiB (fdisk와 같이 5.5TiB 거의) 마이너스 df의 5813233164는 대략적인 inode 테이블 크기에 대해 47255011.5 kiB (약 45 GiB)입니다.

2 단계 : 가져 오기 (파티션에 작성된 총 kiB) :

awk '{ print $3"\t"$10 }' /proc/diskstats

파티션에 맞는 줄을 골라 kiB로 변환하십시오.

편집 : 예 :

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

필자의 경우 sdd1을 사용하여 쓴 총 kiB = 2530108940 섹터 * 512 바이트 / 섹터 / 1024 = 1265054470 kiB (약 1.2 TiB).

3 단계 : 파일 시스템에 데이터를 이미 쓴 경우에만 필요합니다. (파티션에 쓴 총 kiB)에서 (inode 테이블에 쓴 대략 kiB)에서 (df에 표시된 1K- 블록 USED 수)를 뺍니다.

편집 : 예 : inode 테이블에 기록 된 대략적인 kiB = 1265054470 (2 단계에서)-1217095176 (1 단계의 df 출력 참조) = 47959294 kiB (45.7 GiB)

4 단계 : (inode 테이블에 쓴 대략 kiB)를 (kiB에있는 대략 inode 테이블의 크기)로 나누고 100을 곱하여 진행률을 백분율로 가져옵니다.

편집 : 예 : 대략적인 진행률 = 47959294 / 47255011.5 * 100 % = 101.5 %

스크립트

또는 부분 스크립트로 작성하십시오 (안전상의 이유로 fdisk 호출을 스크립팅하는 것을 거부합니다).

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

$ 1 = "파티션 이름"(예 : sdd1), $ 2 = "fdisk에 따른 파티션 섹터", $ 3 = "슬래시가없는 마운트 포인트"로 호출

시험 결과

내 방법을 한 번만 테스트했습니다. 설정:

  • 6TB 파티션

  • cryptsetup을 사용한 암호화

  • -m 0을 제외한 기본 매개 변수로 작성된 파일 시스템

  • ext4lazyinit가 완료되기 전에 파티션에 기록 된 파일 279GiB.

결과 : 완료시 99.7 %의 판독 값 :-)

편집 : 거의 다른 TiB 데이터를 쓴 후 동일한 디스크로 추정치가 101.5 %입니다. 유용 할 정도로 정확하다고 생각합니다.


주어진 예를 갖는 것이 더 좋았으므로 정확히 무엇을 볼 것인지에 대한 아이디어를 얻었습니다.
shirish '

@shirish 제안 해 주셔서 감사합니다.
theaviatrix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.