Перейти к содержанию

Шпаргалка. Траблшутинг в Linux

Траблшутинг — форма решения проблем, часто применяемая к ремонту неработающих устройств или процессов. Представляет собой систематический, опосредованный определённой логикой поиск источника проблемы с целью её решения

Мониторинг

По системе мониторинга мы увидели проблемы с сервером, что делаем...

Состояние дисков

Как проверить место на дисках

df (аббревиатура от disk free) — утилита в UNIX и UNIX-подобных системах, показывает список всех файловых систем по именам устройств, сообщает их размер, занятое и свободное пространство и точки монтирования.

# выведите данные в удобочитаемом формате
df -h

# вывести на экран информацию обо всех файловых системах (даже тех, в которых нет ни одного блока данных)
df -a

# просмотреть данные об использовании дискового пространства файловой системы по каталогу, который находится в ней
df -hT /home

# отобразить информацию об инодах (структурах данных, хранящих информацию об объектах файловой системы)

df -i

# получить информацию по типам файловых систем
df -T

# отобразить на экране только данные о файловых системах определенного типа
df -ht ext4

# вывести на экран все файловые системы, кроме имеющих тип, например ext4
df -x ext4

помимо inode - файл, который был удален, но держится процессом не будет показываться, что занимает место, не видно по df, но файл вы не создадите. Также, можно quota подкрутить, чтобы пользователь за лимиты не вылазил

du выдает отчет об использовании дискового пространства заданными файлами, а также каждым каталогом иерархии подкаталогов каждого указанного каталога.

du -sh /tmp

Проверка состояния жестких дисков

Современные жесткие диски довольно “умные” устройства и, кроме основных присущих им как устройствам хранения и обработки данных свойств, поддерживают технологию самотестирования, анализа состояния, и накопления статистических данных об ухудшении собственных характеристик S.M.A.R.T. (Self-Monitoring Analysis and Reporting Technology).

Smartmontools - утилита для проверки состояния жестких дисков при помощи SMART.

smartctl хорошо получает данные HDD и с ssd / nvme

  • Определение дисков в системе:
smartctl --scan
  • Информация о диске
smartctl -i /dev/sda
  • Подробная информация о состоянии
smartctl -a /dev/sda

Ключевое значение имеет содержимое 3-х столбцов:

  • VALUE - текущее значение параметра
  • WORST - наихудшее значение, которого когда-либо достигало значение Value
  • THRESH - значение, которого должен достигнуть Value этого же атрибута, чтобы состояние атрибута было признано критическим.

Критичным является поле WHEN_FAILED, если оно имеет значение FAIL, то высока вероятность выхода жесткого диска из строя в ближайшее время.

Быстрый тест здоровья жесткого диска

smartctl -H /dev/sda
Пример:

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Если результат не PASSED, то диск следует заменить.

Расширенные встроенные тесты

smartctl --test=long /dev/sda

Пример:

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 98 minutes for test to complete.
Test will complete after Mon Mar  5 01:46:10 2018

Use smartctl -X to abort test.

Для просмотра результатов выполнения тестов используется команда вывода внутреннего журнала после завершения теста:

smartctl -l selftest /dev/sda

Для прерывания теста нужно ввести:

smartctl -X
Полезные ссылки S.M.A.R.T

Если в системе есть софтовый RAID-массив, то информацию по нему можно посмотреть командой

cat /proc/mdstat

бывает аппаратный raid (MegaCLI)

Нагрузка на диски

Утилита iostat позволяет проанализировать загруженность системы. Она выводит основные параметры ввода и вывода данных на диск, скорость записи и чтения данных, а также количество записанных или прочитанных данных. Кроме того, утилита выводит параметры загруженности процессора.

Установка

sudo apt install sysstat

Самый простой пример использования утилиты - это запуск без параметров:

iostat

Основные опции утилиты:

  • — отобразить только информацию об использовании процессора;
  • -d — отобразить только информацию об использовании устройств;
  • -h — выводить данные отчёта в удобном для чтения формате;
  • -k — выводить статистику в килобайтах;
  • -m — выводить статистику в мегабайтах;
  • -o JSON — выводить статистику в формате JSON;
  • -p — вывести статистику по устройству и всем его разделам;
  • -x — вывести расширенную статистику;
  • -y — отображать статистику с момента запуска утилиты, а не системы;
  • -z — спрятать информацию о дисках, у которых нет активности.

Для просмотра в более удобном формате выполните:

 iostat -h

В первой части отчёта находится информация о загруженности процессора. Здесь приведены следующие данные:

  • %user — процент использования процессора программами, запущенными на уровне пользователя;
  • %nice — процент использования процессора программами, запущенными в пространстве пользователя, но с изменённым приоритетом;
  • %system — процент использования процессора ядром;
  • %iowait — процент времени, затраченного на ожидание завершения операций ввода/вывода;
  • %steal — процент простоя виртуального процессора во время передачи гипервизором мощности другому виртуальному процессору;
  • %idle — процент времени простоя процессора (процессор не занят).

Для устройств ввода/вывода также отображается ряд данных со следующей информацией:

  • tps — количество запросов на чтение или запись к устройству в секунду;
  • KB_read/s, MB_read/s — количество килобайт или мегабайт, прочитанных с устройства за секунду;
  • KB_wrtn/s, MB_wrtn/s — количество килобайт или мегабайт, записанных на устройство в секунду;
  • KB_dscd/s, MB_dscd/s — скорость освобождения блоков данных на устройстве, килобайт или мегабайт в секунду;
  • KB_read, MB_read — общее количество прочитанных данных с диска с момента загрузки системы;
  • KB_wrtn, MB_wrtn — количество записанных данных с момента загрузки системы;
  • KB_dscd, MB_dscd — количество освобождённых блоков на диске в результате выполнения операции trim в килобайтах или мегабайтах.

Для отображения всей статистики выполните:

iostat -x
Описание вывода:

  • r/s — количество запросов на чтение в секунду;
  • rKB/s — скорость чтения с диска (КБ/сек);
  • rrqm/s — обобщенное количество запросов на чтение в секунду;
  • %rrqm — количество объединенных запросов чтения;
  • r_await — среднее время (миллисекунды) на обработку запросов чтения к диску (включает в себя время, потраченное в очереди на обработку, и время на обработку запроса);
  • rareq-sz — средний размер запроса для чтения;
  • w/s — количество запросов на запись в секунду;
  • wKB/s — скорость записи на диск (КБ/сек);
  • wrqm/s — обобщенное количество запросов на запись в секунду;
  • %wrqm — количество объединенных запросов записи;
  • w_await — среднее время (миллисекунды) на обработку запросов записи к диску (включает в себя время, потраченное в очереди на обработку, и время на обработку запроса);
  • wareq-sz — средний размер запроса для записи;
  • aqu-sz — средняя длина очереди
  • %util — % CPU, затраченный на передачу I/O запросов к диску («пропускная способность» диска).

Можно просмотреть статистику по каждому разделу устройства, воспользовавшись опцией -p:

 iostat -p /dev/sda

Чтобы утилита автоматически обновляла данные каждую секунду, необходимо добавить интервал (определяется в секундах):

iostat -p /dev/sda 1

Утилита iotop позволяет просмотреть сведения об общем и текущем количестве операций обращения к диску.

Установка

sudo apt install iotop
Запустите утилиту через терминал, выполнив:

 iotop

Опции для работы в программе описаны в таблице ниже.

  • --version - показать номер версии программы и выйти
  • -h, --help - показать данное справочное сообщение и выйти
  • -o, --only - отображать только процессы, которые в данный момент выполняют операции I/O с диском (по умолчанию — отображаются все активные процессы)
  • -b, --batch - неинтерактивный режим
  • -n <число>, --iter=<число> - количество итераций до окончания [бесконечно]
  • -d <сек>, --delay=<сек> - задержка между итерациями [1 секунда]
  • -p , --pid= - PID процесса, который нужно отслеживать
  • -u <имя_пользователя>, --user=<имя_пользователя> - имя пользователя, которого нужно - отследить
  • -P, --processes - отображать только процессы (по умолчанию — все процессы и потоки)
  • -a, --accumulated - показывать накопленный ввод-вывод вместо пропускной способности
  • -k, --kilobytes - отображать информацию в KБ
  • -t, --time - добавить отображение времени выполнения проверки
  • -q, --quiet - уменьшить количество выводимой информации (подразумевается --batch)

Также iotop поддерживает некоторое управление клавиатуры:

  • стрелки влево-вправо — изменить сортировку колонок;
  • r — изменить сортировку строк в выбранной колонке на обратную (a-z > z-a);
  • i — изменить nice процесса (утилитой ionice);

Нагрузка на Процессор

Top - команда, которая позволяет наблюдать в реальном времени динамику работающей системы. Программа показывает обобщённую информацию по системе, а также список процессов или потоков, обслуживающихся в настоящее время ядром Linux.

Во время работы программы доступны различные команды, но в первую очередь следует запомнить две из них:

  • h — выводит экран помощи,
  • q — выход из программы.

Вывод программы делится на три части:

  • заголовок с суммарной информацией о загрузке системы,
  • строка ввода (в данный момент пустая),
  • отсортированный список процессов.

В заголовке отображается следующая информация:

  • Первая строка — загрузка системы.

    • Текущее время.
    • Время работы системы после включения питания (up time).
    • Количество пользователей, которые в данный момент работают в системе.
    • Средняя загрузка системы (load average) минуту, пять минут и пятнадцать минут назад.
  • Вторая строка — процессы.

    • total — общее количество процессов в системе.
    • running — количество процессов, выполняемых процессором или стоящих в очереди на выполнение.
    • sleeping — количество процессов, ожидающих какого-либо события ввода-вывода.
    • stoped — количество приостановленных процессов.
    • zombie — количество процессов, находящихся в состоянии «зомби» (подробнее о зомби будет рассказано ниже).
  • Третья строка — состояние процессора.

    • us — процент использования процессорного времени программами пользователей.
    • sy— процент использования процессорного времени процессами ядра Linux.
    • ni — процент использования процессорного времени программами с измененным приоритетом.
    • id — простой процессора.
  • Четвертая строка — использование оперативной памяти.

    • total — общее количество оперативной памяти.
    • used — количество использованной оперативной памяти.
    • free — количество свободной оперативной памяти.
  • Пятая строка — использование swap-пространства.
    • total — общее количество swap-пространства.
    • used — количество использованного swap-пространства.
    • free — количество свободного swap-пространства.

В списке процессов по умолчанию показаны следующие столбцы:

  • PID — PID процесса.
  • USER — пользователь, с правами которого выполняется процесс.
  • PR — приоритет процесса.
  • NI — на сколько больше или меньше процесс «нравится» (от слова nice) системе. То есть на - сколько был изменен приоритет процесса.
  • VIRT — общее количество виртуальной памяти, используемой программой. Значение в - килобайтах.
  • RES — количество резидентной (не перемещаемой в swap) памяти в килобайтах.
  • SHR — количество разделяемой (shared) памяти программы в килобайтах.
  • S — состояние процесса:
  • D — uninterruptible sleep.
  • R — процесс выполняется процессором или стоит в очереди на выполнение.
  • S — процесс ожидает событие ввода-вывода.
  • T — выполнение процесса приостановлено.
  • Z — состояние «зомби».

Команды

Теперь рассмотрим, какие команды поддерживает top.

  • А - Переключает количество одновременно выводимых на экран окон. По умолчанию показано одно окно.
  • d или s - Устанавливает значение задержки перерисовки экрана. Значение по умолчанию 3 секунды.
  • l - Включение/выключение поля «средняя загрузка системы» в заголовке.
  • t - Включение/выключение полей описания процессов и загрузки процессора в заголовке.
  • m - Включение/выключение полей, описывающих использование оперативной памяти и файла подкачки.
  • b - Выделение процессов, выполняемых процессором (состояние Run).
  • c - Включает/выключает отображение имени программы/полной командной строки в поле COMMAND.
  • i - Включает отображение только процессов, выполняемым процессором, или всех процессов системы.
  • x - Включает/выключает подсветку колонки, по которой происходит сортировка процессов.
  • z - Включает/выключает цвет.
  • Пробел - Заставляет программу перечитать список процессов.
  • u - Показывает процессы, выполняемые определенным пользователем.
  • k - Послать сигнал процессу.
  • r - Изменить значение поля nice (приоритет процесса).

Batch-режим Кроме интерактивного режима, в котором top выводит данные на экран, можно использовать так называемый командный режим (Batch mode). Он применяется, когда результаты работы программы необходимо передать другим программам или сохранить в файле.

Для запуска программы в командном режиме используют параметр –b. В этом случае список отсортированных процессов (по умолчанию, процессы сортируются по проценту использования процессорного времени) будет с определенной задержкой (по умолчанию три секунды) выводится на стандартный вывод. Количество повторов не ограничено, поэтому необходимо явно завершать работу программы, например, при помощь комбинации клавиш Ctrl+C.

Рассмотрим некоторые параметры, которые можно применять в командном режиме программы top.

  • –n — количество повторов.
  • –d — задержка между повторами в секундах.
  • –u — определяет пользователя, с правами которого выполняются процессы.
  • –p — определяет PID процессов, за которыми должна следить программа.

    Например, необходимо с задержкой в четыре секунды два раза получить список процессов, выполняемых с правами пользователя daemon. Для этого программу запускают со следующими параметрами:
top -b -d 4 -n 3 -u daemon

Также полезные команды uptime и htop

Нагрузка на Оперативная память

Утилиты для мониторинга оперативной памяти - top - htop - vmstat - free -m

Так же подробную информацию по памяти мы можем посмотреть в файле meminfo

cat /proc/meminfo

Реальная память, которая может быть выделена по требованию - available. Это как раз free+buffer/cache. На собеседованиях такое тоже могут спросить. Это важное знание.

Процессы

Что такое процесс?

Процесс Linux- это экземпляр программы, запущенный в памяти. Все процессы можно разделить на обычные и фоновые. Linux - это многопользовательская система, каждый пользователь может запускать одни и те же программы, и даже один пользователь может захотеть запустить несколько экземпляров одной программы, поэтому ядру нужно как-то идентифицировать такие однотипные процессы. Для этого каждому процессу присваивается **PID** (Proccess Identificator).

Каждый из процессов может находиться в одном из таких состояний:

  • Запуск - процесс либо уже работает, либо готов к работе и ждет, когда ему будет дано процессорное время;
  • Ожидание - процессы в этом состоянии ожидают какого-либо события или освобождения системного ресурса. Ядро делит такие процессы на два типа - те, которые ожидают освобождения аппаратных средств и приостановление с помощью сигнала;
  • Остановлено - обычно, в этом состоянии находятся процессы, которые были остановлены с помощью сигнала;
  • Зомби - это мертвые процессы, они были остановлены и больше не выполняются, но для них есть запись в таблице процессов, возможно, из-за того, что у процесса остались дочерние процессы.

Утилита ps одна из самых простых и в то же время часто используемых программ для просмотра списка процессов в Linux. Она не поддерживает интерактивный режим, зато имеет множество опций для настройки вывода тех или иных параметров процессов в Linux.

Теперь рассмотрим опции утилиты. Они делятся на два типа - те, которые идут с дефисом Unix и те, которые используются без дефиса - BSD. Лучше пользоваться только опциями Unix, но мы рассмотрим и одни и другие. Заметьте, что при использовании опций BSD, вывод утилиты будет организован в BSD стиле.

  • -A, -e, (a) - выбрать все процессы;
  • -a - выбрать все процессы, кроме фоновых;
  • -d, (g) - выбрать все процессы, даже фоновые, кроме процессов сессий;
  • -N - выбрать все процессы кроме указанных;
  • - выбирать процессы по имени команды;
  • -G - выбрать процессы по ID группы;
  • -p, (p) - выбрать процессы PID;
  • --ppid - выбрать процессы по PID родительского процесса;
  • -s - выбрать процессы по ID сессии;
  • -t, (t) - выбрать процессы по tty;
  • -u, (U) - выбрать процессы пользователя.

Опции форматирования:

  • - отображать информацию планировщика;
  • -f - вывести максимум доступных данных, например, количество потоков;
  • -F - аналогично -f, только выводит ещё больше данных;
  • -l - длинный формат вывода;
  • -j, (j) - вывести процессы в стиле Jobs, минимум информации;
  • -M, (Z) - добавить информацию о безопасности;
  • -o, (o) - позволяет определить свой формат вывода;
  • --sort, (k) - выполнять сортировку по указанной колонке;
  • -L, (H)- отображать потоки процессов в колонках LWP и NLWP;
  • -m, (m) - вывести потоки после процесса;
  • -V, (V) - вывести информацию о версии;
  • -H - отображать дерево процессов;

Примеры:

Выводит все процессы на сервере

ps aux

Все процессы, кроме лидеров групп, в том же режиме отображения:

 ps -A

Все процессы, включая фоновые и лидеры групп:

 ps -d

Чтобы вывести больше информации о процессах используйте опцию -f:

 ps -f

При использовании опции -f команда выдает такие колонки:

  • UID - пользователь, от имени которого запущен процесс;
  • PID - идентификатор процесса;
  • PPID - идентификатор родительского процесса;
  • C - процент времени CPU, используемого процессом;
  • STIME - время запуска процесса;
  • TTY - терминал, из которого запущен процесс;
  • TIME - общее время процессора, затраченное на выполнение процессора;
  • CMD - команда запуска процессора;
  • LWP - показывает потоки процессора;
  • PRI - приоритет процесса.

Например, также можно вывести подробную информацию обо всех процессах:

 ps -Af

Больше информации можно получить, использовав опцию -F:

 ps -Fe

Эта опция добавляет такие колонки:

  • SZ - это размер процесса в памяти;
  • RSS - реальный размер процесса в памяти;
  • PSR - ядро процессора, на котором выполняется процесс.

Если вы хотите получить еще больше информации, используйте вместо -f опцию -l:

 ps -l

Эта опция добавляет отображение таких колонок:

  • F - флаги, ассоциированные с этим процессом;
  • S - состояние процесса;
  • PRI - приоритет процесса в планировщике ядра Linux;
  • NI - рекомендованный приоритет процесса, можно менять;
  • ADDR - адрес процесса в памяти;
  • WCHAN - название функции ядра, из-за которой процесс находится в режиме ожидания.

Часто используемые команды:

# отобрать все процессы, запущенные от имени определенного пользователя
 ps -fu root

# С помощью опции -H можно отобразить дерево процессов:
 ps -fHu root

# Если вас интересует информация только об определенном процессе, то вы можете использовать опцию -p и указать PID процесса:
 ps -fp 1

# Через запятую можно указать несколько PID:
 ps -fp 1,2,3

# Опция -С позволяет фильтровать процессы по имени, например, выберем только процессы chrome:
 ps -fC chrome

# Дальше можно использовать опцию -L чтобы отобразить информацию о процессах:
 ps -fL

# Очень интересно то, с помощью опции -o можно настроить форматирование вывода, например, вы можете вывести только pid процесса и команду:
ps -o pid,comm

# Вы можете выбрать такие колонки для отображения: pcpu, pmem, args, comm, cputime, pid, gid, lwp, rss, start, user, vsize, priority. Для удобства просмотра можно отсортировать вывод программы по нужной колонке, например, просмотр процессов, которые используют больше всего памяти:
ps -Fe --sort rss

# Или по проценту загрузки cpu:
 ps -FA --sort pcpu

# Ещё одна опция - -M, которая позволяет вывести информацию про права безопасности и флаги SELinux для процессов:
 ps -eM

# Общее количество запущенных процессов Linux можно узнать командой:
 ps -e | wc

Просматривать информацию по конкретному сервису

systemctl status nginx

С помощью системных вызовов можно понять, к каким файлам обращается программа, какие сетевые порты она использует, какие ресурсы ей нужны, а также какие ошибки возвращает ей система. Это помогает разобраться в особенностях работы программы и лучше понять причину ошибки. За всё это отвечает команда strace Linux.

Команда strace показывает все системные вызовы программы, которые та отправляет к системе во время выполнения, а также их параметры и результат выполнения. Но при необходимости можно подключиться и к уже запущенному процессу.

В самом простом варианте strace запускает переданную команду с её аргументами и выводит в стандартный поток ошибок все системные вызовы команды. Давайте разберём опции утилиты, с помощью которых можно управлять её поведением:

  • -i - выводить указатель на инструкцию во время выполнения системного вызова;
  • -k - выводить стек вызовов для отслеживаемого процесса после каждого системного вызова;
  • -o - выводить всю информацию о системных вызовах не в стандартный поток ошибок, а в файл;
  • -q - не выводить сообщения о подключении о отключении от процесса;
  • -qq - не выводить сообщения о завершении работы процесса;
  • -r - выводить временную метку для каждого системного вызова;
  • -s - указать максимальный размер выводимой строки, по умолчанию 32;
  • -t - выводить время суток для каждого вызова;
  • -tt - добавить микросекунды;
  • -ttt - добавить микросекунды и количество секунд после начала эпохи Unix;
  • -T - выводить длительность выполнения системного вызова;
  • -x - выводить все не ASCI-строки в шестнадцатеричном виде;
  • -xx - выводить все строки в шестнадцатеричном виде;
  • -y - выводить пути для файловых дескрипторов;
  • -yy - выводить информацию о протоколе для файловых дескрипторов;
  • -c - подсчитывать количество ошибок, вызовов и время выполнения для каждого системного вызова;
  • -O - добавить определённое количество микросекунд к счетчику времени для каждого вызова;
  • -S - сортировать информацию выводимую при опции -c. Доступны поля time, calls, name и nothing. По умолчанию используется time;
  • -w - суммировать время между началом и завершением системного вызова;
  • -e - позволяет отфильтровать только нужные системные вызовы или события;
  • -P - отслеживать только системные вызовы, которые касаются указанного пути;
  • -v - позволяет выводить дополнительную информацию, такую как версии окружения, статистику и так далее;
  • -b - если указанный системный вызов обнаружен, трассировка прекращается;
  • -f - отслеживать также дочерние процессы, если они будут созданы;
  • -ff - если задана опция -o, то для каждого дочернего процесса будет создан отдельный файл с именем имя_файла.pid.
  • -I - позволяет блокировать реакцию на нажатия Ctrl+C и Ctrl+Z;
  • -E - добавляет переменную окружения для запускаемой программы;
  • -p - указывает pid процесса, к которому следует подключиться;
  • -u - запустить программу, от имени указанного пользователя.

Ма рассмотрели основные опции strace, но чтобы полноценно ею пользоваться, нужно ещё разобраться с системными вызовами, которые используются чаще всего. Мы не будем рассматривать все, а только основные. Многие из них вы уже и так знаете, потому что они называются так же, как и команды в терминале:

  • fork - создание нового дочернего процесса;
  • read - попытка читать из файлового дескриптора;
  • write - попытка записи в файловый дескриптор;
  • open - открыть файл для чтения или записи;
  • close - закрыть файл после чтения или записи;
  • chdir - изменить текущую директорию;
  • execve - выполнить исполняемый файл;
  • stat - получить информацию о файле;
  • mknod - создать специальный файл, например, файл устройства или сокет;

Примеры использования **Strace**

strace uname
Как и ожидалось, мы видим список системных вызовов, которые делает утилита, чтобы узнать версию ядра. Синтаксис вывода такой:

имя_системного_вызова (параметр1, параметр2) = результат сообщение

Имя системного вызова указывает, какой именно вызов использовала программа. Для большинства вызовов характерно то, что им нужно передавать параметры, имена файлов, данные и так далее. Эти параметры передаются в скобках. Далее идет знак равенства и результат выполнения. Если всё прошло успешно, то здесь будет ноль или положительное число. Если же возвращается отрицательное значение, делаем вывод, что произошла ошибка. В таком случае выводится сообщение.

Например, в нашем выводе есть сообщения об ошибке:

openat(AT_FDCWD, "/usr/local/cuda-6.5/lib64/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

Здесь результат выполнения -1 и сообщение говорит, что файл не найден. Но на работу программы это не влияет. Это проблема подключения сторонних библиотек и к этой утилите она не имеет отношения. А основная работа программы выполняется строчкой:

uname({sysname="Linux", nodename="sergiy-pc1", ...}) = 0
И здесь ядро вернуло положительный результат.

Подключиться к нашему запущенному процессу:

sudo strace -p 31796

Сеть

По сети, ещё полезна iftop (по dig) dig +trace - полезна, для отладки верхнеуровневых DNS

Логи

По логам (да и не только), полезны также ещё / sed / awk / tr /