Как получить общее количество записанных данных по процессам и по файлам в системе Linux?

455
con-f-use

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

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

1

2 ответа на вопрос

1
AnythingIsFine

Вы можете написать скрипт bash для этого ... и настроить его в crontab для еженедельного запуска и записи его вывода в файл.

* определить, сколько определенного процесса записано в файл, например:

#get its pid PID=`ps -ef | awk '/<process_name>/ '` #print out size and filename lsof -p $ | awk '/<file_you_want>/ ' | sort -u #find out device on which above file is located df /path/to/file_you_want | awk '/\/dev/ ' 

* рассчитать, сколько было записано за одну неделю в файл следующим образом:

#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 ''` #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 ''` #calculate delta DELTA=`echo "$-$" | bc # print the amount of bytes that have been written in 1 week echo $DELTA 
1
Tensibai

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

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

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

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