Wie erhalte ich auf einem Linux-System insgesamt geschriebene Daten pro Prozess und Datei?

523
con-f-use

Ich muss ein paar Daten darüber sammeln, wie viel jeder Prozess auf meinem System auf eine bestimmte Festplatte schreibt. Ich bin erst nach einer Woche an einer Gesamtsumme interessiert. Ich brauche auch etwas ähnliches für Dateien. Das heißt, ich würde gerne die Top 10 der Dateien wissen, die in einer Woche die meisten Daten geschrieben haben und wie viel in jede Datei geschrieben wurde.

Zur Veranschaulichung sollte das Endergebnis zwei Tabellen / Textdateien / ein beliebiges verwaltbares Dateiformat sein, das Daten wie folgt enthält:

Durch prozess:

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 ... 

Nach Datei:

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 ... 

Wie kann ich das erreichen?

1

2 Antworten auf die Frage

1
AnythingIsFine

Sie können dazu ein Bash-Skript schreiben ... und es in crontab so einrichten, dass es wöchentlich ausgeführt wird und seine Ausgabe in eine Datei schreibt

* Ermitteln Sie, wie viel ein bestimmter Prozess in eine Datei geschrieben hat:

#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/ ' 

* Berechne, wie viel in einer Woche in eine Datei geschrieben wurde:

#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

Ich beantworte Ihren ersten Satz hier nur teilweise, die durch den Prozess geschriebene Datenmenge, und die Verknüpfung dieser IO mit der Festplatte erfordert mehr Arbeit, um die Prozess-IO und die Festplatten-IO-Informationen zu korrelieren (und wird wahrscheinlich bei hohen IO-Lasten zerbrechen).

Eine Option für diese Informationen ist die Verwendung von netdata, die das Lesen und Schreiben von Festplatten nach Anwendung aufzeichnet.

Sie können dies in einer Timeseries-Datenbank wie infuxDB speichern (netdata kann dies nativ tun) und dann die Werte pro App mit Grafana oder einem anderen Qury-Tool aggregieren lassen oder vom Quellcode des App-Plugins inspirieren, um die Werte durch Prozessanalyse zu ermitteln / proc-Dateisystem für notwendige Informationen.
Ein Beispiel dafür, wie man Informationen (Swap) für alle Prozesse erhält, ist hier (Ich verlinke auf meine eigene Antwort, da sie nicht über das findErgebnis hinausgeht und es eine echte Verbesserung der Geschwindigkeit ist.

Eine andere Option könnte darin bestehen, in den Audit-Daemon unter Linux zuzugreifen, um zu sehen, ob aureport Ihnen die Informationen geben kann, die Sie suchen. Ich habe auditd nie für diesen Zweck konfiguriert. Es gibt eine Reihe von Tutorials über Google, die verschiedene Aspekte behandeln, aber diese spezielle klingt, als müssten Sie sich in die Manpages einarbeiten und viel testen.