Чи є спосіб отримати співвідношення Hit / Miss кешу для блокових пристроїв в Linux?


21

Чи можна побачити в Linux скільки запитів для читання і запису з користувальницького простору призводить до потрапляння кешів і пропусків для блокових пристроїв?

Відповіді:


9

Ви можете розробити власний скрипт SystemTap . Вам потрібно врахувати наступні дві підсистеми:

  • VFS: це представляє всі запити вводу / виводу перед кешем буфера (тобто абсолютно кожен запит вводу / виводу); переглянути «vfs.read», «vfs.write» та зонди «kernel.function (« vfs_ * »)»; вам потрібно відфільтрувати блокові пристрої, які ви хочете контролювати, за їхніми основними + незначними числами.
  • Блок: це відображає всі запити вводу-виводу, що надсилаються на блокові пристрої до планувальника вводу-виводу (що також робить злиття + упорядкування запитів вводу-виводу); тут ми знаємо, які запити пропустили кеш-пам'ять; переглянути зонд "ioblock.request".

Розвиток SystemTap потребує певного часу, щоб навчитися. Якщо ви помірний розробник і маєте хороші знання в Linux, вам це потрібно зробити за 3-4 дні. Так, для вивчення потрібен час, але ви будете дуже задоволені результатами - SystemTap дає можливість (безпечно) розміщувати зонди майже в будь-якому місці ядра Linux.

Зверніть увагу, що ваше ядро ​​повинно мати підтримку для завантаження та вивантаження модулів ядра. Сьогодні це підтримує більшість ядер акцій. Також вам потрібно буде встановити символи налагодження для вашого ядра. Для моєї системи Ubuntu це було так само просто, як завантаження декількох сотень МБ .deb-файлів, які команда розробки ядра Ubuntu склала для мене. Це пояснюється, наприклад, на сторінці Wikita SystemtapOnUbuntu .

PS Підходьте до підходу SystemTap лише в тому випадку, якщо у вас немає іншого рішення, оскільки це абсолютно новий фреймворк, який ви повинні вивчити, і це коштує часу / грошей, а іноді і фрустрації.


1
+1 приємне та чисте пояснення. спасибі, я також перевіряю systemtap.
risyasin


8

Я пішов вперед і написав степ-скрипт для цього. Є на вікі системного вкладу, але він, здається, не є правильним. У базовому тестуванні це здається досить точним, але 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
}

Дивовижно! Я додав трохи середнього кешу використання stat для друку, коли ви закриєте його: 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]ви можете допомогти?
Фопа Леон Константин

2

/ proc / slabinfo - це хороший старт, але не дає тобі відомості, яку ви шукаєте (не обманюйте відсотки потрапляння / пропуску в системах з увімкненими кількома ядрами та статистикою; це щось інше). Наскільки я знаю, не існує способу витягнути цю конкретну інформацію з ядра, хоча це не повинно бути дуже важко написати трохи коду.

Редагувати: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html


1

Тепер є утиліта кешстату з пакету perf -tools .

Автор також перераховує деякі (можливо, більш жорсткі) альтернативи, якими користуються люди:

A) Вивчіть швидкість пропуску кеш-сторінки сторінки, використовуючи iostat (1) для моніторингу читання дисків, і припустимо, що це пропуски кешу, а не, наприклад, O_DIRECT. Швидкість пропуску, як правило, є більш важливою метрикою, ніж коефіцієнт відношення, оскільки помилки пропорційні болю при застосуванні. Також використовуйте безкоштовно (1), щоб переглянути розміри кешу.

B) Опустіть кеш сторінки (echo 1> / proc / sys / vm / drop_caches) та виміряйте, наскільки продуктивність погіршується! Я люблю використовувати негативний експеримент, але це, звичайно, болючий спосіб пролити трохи світла на використання кешу.

C) Використовуйте sar (1) та вивчайте незначні та основні несправності. Я не думаю, що це працює (наприклад, регулярний введення / виведення).

D) Використовуйте скрипт cache-hit-rate.stp SystemTap, який є номером два в Інтернеті для співвідношення хітів сторінки кешу сторінки Linux. Він інструментує доступ до кешу високо в стеку, в інтерфейсі VFS, так що можна побачити читання будь-якої файлової системи або пристрою зберігання даних. Пропуски кешу вимірюються за допомогою дискового вводу / виводу. Тут також відсутні деякі типи завантаженості (деякі згадуються у "Уроках" на цій сторінці), а коефіцієнти називає "ставками".


1

Якщо ви зацікавлені у співвідношенні хіт / пропуску введення-виведення конкретного процесу, простий, але дуже ефективний підхід - це прочитати /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, тому для процесів, які читають / записують багато з / у трубу, обчислення вище буде перекошене, повідомляючи про вищий показник звернень, ніж ефективний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.