1

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

Как мне этого добиться?

2 ответа2

1

Вы можете написать скрипт 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
1

Я лишь частично отвечаю на ваше самое первое предложение здесь: объем данных, записываемых процессом, связывая те операции ввода-вывода, с которыми диск потребует больше работы для сопоставления данных ввода-вывода процесса и операций ввода-вывода диска (и, вероятно, сбоит при высоких нагрузках ввода-вывода).

Одним из вариантов этой информации является использование netdata, которая записывает чтение и запись диска приложением.

Вы можете сохранить это в базе данных временных рядов, такой как infuxDB (netdata может сделать это изначально), а затем получить значения для приложения, агрегированные с помощью grafana или любого другого инструмента qury, или получить вдохновение из исходного кода плагина приложения, чтобы получить значения путем анализа процесса Файловая система /proc для получения необходимой информации.
Пример того, как получить информацию (своп) для всех процессов, приведен здесь (я ссылаюсь на мой собственный ответ, так как он не перебирает результат find и это реальное улучшение скорости)

Другим вариантом может быть поиск в демоне аудита в linux, чтобы узнать, может ли aureport предоставить вам информацию, которую вы ищете. Я никогда не настраивал audd для этой цели, в Google есть куча учебников, охватывающих различные аспекты, но этот конкретный, похоже, вам нужно покопаться в man-страницах и много тестировать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .