Как получить общее количество записанных данных по процессам и по файлам в системе Linux?
Мне нужно собрать некоторые данные о том, сколько каждый процесс в моей системе записывает на определенный диск. Меня интересует только общий итог, скажем, через неделю. Мне также нужно что-то подобное для файлов. Т.е. я хотел бы знать топ-10 файлов, в которые записано наибольшее количество данных за неделю, и сколько именно было записано в каждый из них.
Чтобы проиллюстрировать это, конечный результат должен быть двумя таблицами / текстовыми файлами / любым другим управляемым форматом файла, в котором есть такие данные:
По процессу:
Process Total amount of data written to /dev/sda by that process in a week
-------- ----------
logdaemon 101 GB
gvfsd-sftp --spawner :1.19 /org/gtk/gvfs/exec_spaw/2 [pool] 30 GB
openoffice 50 GB
[jbd2/dm-0-2] 2 GB
...
По файлу:
File Total amount written to that file last week
-------- --------
/var/log/some_giant_logfile.log 100 GB
/home/confus/Videos/great_big_video.mpg 16 GB
...
Как мне этого добиться?
3 ответа
Вы можете написать скрипт bash для этого... и настроить его в crontab для еженедельного запуска и записи его вывода в файл.
* определить, сколько определенного процесса записано в файл, например:
#get its pid
PID=`ps -ef | awk '/<process_name>/ {print $2}'`
#print out size and filename
lsof -p ${PID} | awk '/<file_you_want>/ {print $7"\t"$NF}' | sort -u
#find out device on which above file is located
df /path/to/file_you_want | awk '/\/dev/ {print $0}'
* рассчитать, сколько было записано за одну неделю в файл следующим образом:
#issue the below command and save the output to a file
NEW=`du /path/to/file_you_want | tee -a /path/to/store_value.txt`
#read the output one week later
OLD_VAL=`grep '/path/to/file_you_want' /path/to/store_value.txt | awk '{print $1}'`
#overwrite new value and store it in memory
NEW=`du /path/to/file_you_wan | tee -a /path/to/store_value.txt`
NEW_VAL=`echo $NEW | awk '{print $1}'`
#calculate delta
DELTA=`echo "${NEW_VAL}-${OLD_VAL}" | bc
# print the amount of bytes that have been written in 1 week
echo $DELTA
Я лишь частично отвечаю на ваше самое первое предложение здесь: объем данных, записываемых процессом, связывая те операции ввода-вывода, с которыми диск потребует больше работы для сопоставления данных ввода-вывода процесса и операций ввода-вывода диска (и, вероятно, сбоит при высоких нагрузках ввода-вывода).
Одним из вариантов этой информации является использование netdata, которая записывает чтение и запись диска приложением.
Вы можете сохранить это в базе данных временных рядов, такой как infuxDB (netdata может сделать это изначально), а затем получить значения для приложения, агрегированные с помощью grafana или любого другого инструмента qury, или получить вдохновение из исходного кода плагина приложения, чтобы получить значения путем анализа процесса Файловая система / proc для получения необходимой информации.
Пример того, как получить информацию (своп) для всех процессов, находится здесь (я ссылаюсь на мой собственный ответ, поскольку он не повторяется find
результат и это реальное улучшение скорости)
Другим вариантом может быть поиск в демоне аудита в linux, чтобы узнать, может ли aureport предоставить вам информацию, которую вы ищете. Я никогда не настраивал audd для этой цели, в Google есть куча учебников, охватывающих различные аспекты, но этот конкретный кажется звучит так, как будто вам нужно копаться в man-страницах и много тестировать.
Чтобы получить представление «по процессу» в реальном времени, я бы рекомендовал:
sudo iotop -a -o -P
'-a' накапливает прочитанные/записанные данные
'-o' показывает только процессы с вводом/выводом
'-P' показывает только процессы вместо всех запущенных потоков
Недостаток: если процесс завершается после каждого запуска, iotop его не видит.
Чтобы найти часто меняющиеся файлы, я использую эту команду:
sudo inotifywait -e modify -e attrib -e move -e create -e delete -m -r /var /home
Возможно, вам нужно увеличить количество часов:
sudo sh -c "echo 180000 > /proc/sys/fs/inotify/max_user_watches"
Это не покажет вам объем записанных данных, но поможет отслеживать, как часто изменяются файлы qhat.