Linux에서 블록 장치에 대한 캐시 적중 / 미스 비율을 얻는 방법이 있습니까?


21

Linux에서 사용자 공간의 읽기 및 쓰기 요청이 얼마나 많은지 블록 장치에 대해 캐시 적중 및 누락이 발생하는 것을 볼 수 있습니까?

답변:


9

고유 한 SystemTap 스크립트를 개발할 수 있습니다 . 다음 두 하위 시스템을 고려해야합니다.

  • VFS : 버퍼 캐시 이전의 모든 I / O 요청 (즉, 모든 I / O 요청)을 나타냅니다. "vfs.read", "vfs.write"및 "kernel.function ("vfs_ * ")"프로브를 검토하십시오. 모니터링하려는 블록 장치를 각각의 주요 + 부 번호로 필터링해야합니다.
  • 블록 : 이것은 I / O 스케줄러 이전에 블록 장치로 전송 된 모든 I / O 요청을 나타냅니다 (I / O 요청의 병합 + 재정렬도 수행함). 여기서는 버퍼 캐시에서 누락 된 요청을 알고 있습니다. "ioblock.request"프로브를 검토하십시오.

SystemTap 개발에는 시간이 걸립니다. 개발자가 적당하고 Linux에 대해 잘 알고 있다면 3-4 일 안에 완료해야합니다. 예, 배우는 데 시간이 걸리지 만 결과에 매우 만족합니다. SystemTap은 Linux 커널의 거의 모든 장소에 프로브를 안전하게 배치 할 수있는 기회를 제공합니다.

커널은 커널 모듈로드 및 언로드를 지원해야합니다. 오늘날 대부분의 주식 커널이이를 지원합니다. 또한 커널에 대한 디버그 기호를 설치해야합니다. Ubuntu 시스템의 경우 Ubuntu 커널 개발 팀에서 컴파일 한 수백 MB .deb 파일을 다운로드하는 것만 큼 쉬웠습니다. 예를 들어 SystemtapOnUbuntu Wiki 페이지 에서 설명합니다 .

PS 다른 솔루션이없는 경우에만 SystemTap 방식을 취하십시오. 완전히 새로운 프레임 워크이기 때문에 시간 / 돈과 때로는 좌절이 필요하기 때문입니다.


1
+1 좋고 깔끔한 설명. 감사합니다. systemtap도 체크 아웃하겠습니다.
risyasin


8

나는 이것을 위해 stap 스크립트를 작성했습니다. systemtap 위키에 하나가 있지만 올바르지 않은 것 같습니다. 기본 테스트에서는 YMMV이지만 매우 정확합니다.

#! /usr/bin/env stap
global total_bytes, disk_bytes, counter

probe vfs.read.return {
  if (bytes_read>0) {
    if (devname=="N/A") {
    } else {
      total_bytes += bytes_read
    }
  }
}
probe ioblock.request
{
    if (rw == 0 && size > 0)
    {
        if (devname=="N/A") { 
        } else {
          disk_bytes += size
        }
    }

}

# print VFS hits and misses every 5 second, plus the hit rate in %
probe timer.s(5) {
    if (counter%15 == 0) {
        printf ("\n%18s %18s %10s %10s\n", 
            "Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate")
    }
    cache_bytes = total_bytes - disk_bytes
    if (cache_bytes < 0)
      cache_bytes = 0
    counter++
    hitrate =  10000 * cache_bytes / (cache_bytes+disk_bytes)
    missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes)
    printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n",
        cache_bytes/1024, disk_bytes/1024,
        missrate/100, missrate%100, hitrate/100, hitrate%100)
    total_bytes = 0
    disk_bytes = 0
}

대박! 나는 당신이 그것을 닫을 때 출력하기 위해 약간의 평균 캐시 사용 통계를 추가했습니다 : pastie.org/1845683
entropo

다음 오류가 발생하여 코드를 복사 / 붙여 넣기하여 실행할 semantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]수 있습니까?
Fopa Léon Constantin

2

/ proc / slabinfo는 좋은 시작이지만, 원하는 정보를 제공하지는 않습니다 (여러 코어와 통계가 활성화 된 시스템의 적중률 / 미스율 비율에 속지 마십시오). 내가 아는 한, 특정 정보를 커널에서 꺼내는 방법은 없지만 약간의 코드를 작성하는 것은 끔찍한 일이 아닙니다.

편집 : http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html


1

이제 perf-tools 패키지 의 cachestat 유틸리티가 있습니다 .

저자는 또한 사람들이 사용하는 일부 (아마도 더 조잡한) 대안을 나열합니다.

A) 디스크 읽기를 모니터하기 위해 iostat (1)을 사용하여 페이지 캐시 누락 비율을 연구하십시오. 예를 들어 O_DIRECT가 아닌 캐시 누락이라고 가정하십시오. 미스 비율은 어쨌든 비율보다 더 중요한 지표입니다. 미스는 응용 프로그램의 고통에 비례하기 때문입니다. 또한 캐시 크기를 보려면 free (1)를 사용하십시오.

B) 페이지 캐시를 삭제하고 (echo 1> / proc / sys / vm / drop_caches) 성능이 얼마나 악화되는지 측정하십시오! 나는 부정적인 실험의 사용을 좋아하지만 이것은 물론 캐시 사용에 약간의 고통을주는 방법입니다.

C) sar (1)을 사용하고 사소한 결함을 연구하십시오. 나는 이것이 작동하지 않는다고 생각한다 (예를 들어, 정규 I / O).

D) Linux 페이지 캐시 적중률에 대한 인터넷 검색에서 2 위인 cache-hit-rate.stp SystemTap 스크립트를 사용하십시오. VFS 인터페이스에서 스택의 캐시 액세스를 높이므로 모든 파일 시스템 또는 스토리지 장치에 대한 읽기를 볼 수 있습니다. 캐시 미스는 디스크 I / O를 통해 측정됩니다. 또한 일부 워크로드 유형 (일부는 해당 페이지의 "강의"에 나와 있음)이 누락되고 호출 비율은 "요금"입니다.


1

특정 프로세스의 IO 적중률 / 미스율에 관심이있는 경우 간단하지만 매우 효과적인 방법은 /proc/<pid>/io파일 을 읽는 것 입니다.

여기 4 가지 주요 값이 있습니다.

  • rchar: 판독의 총 개수는 바이트에서 뷰의인가 시점 (예 : 물리적 스토리지에서보다는 캐시로부터 충족 판독간에 차이없이)
  • wchar: 위와 같지만 쓴 바이트 수
  • read_bytes: 스토리지 서브 시스템에서 실제로 읽은 바이트
  • write_bytes: 실제로 스토리지 서브 시스템에 기록 된 바이트

프로세스에 다음 값이 있다고 가정하십시오.

rchar: 1000000
read_bytes: 200000

읽기 캐시 미스 비율 (바이트)은 100*200000/1000000 = 20%적중률은100-20 = 80%

그러나 캐치가 있습니다. rchar값에 tty IO가 포함되므로 파이프에서 /로 로트를 많이 읽고 쓰는 프로세스의 경우 위 계산이 왜곡되어 유효보다 높은 적중률을보고합니다.

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