Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Debian Linux - Millionen kleiner Dateien löschen

Frage Linux Debian

Mitglied: bblanke

bblanke (Level 1) - Jetzt verbinden

01.02.2013, aktualisiert 13:26 Uhr, 6096 Aufrufe, 20 Kommentare

Beim löschen von Millionen kleiner Dateien stürzt der Server ab

Hallo Zusammen,

ich habe auf einem Debian Server ein Verzeichnis welches mehrere Millionen Session files beinhaltet.
Diese Files und das Verzeichnis werden nicht mehr benötigt und können gelöscht werden.

Meine Inode Auslastung liegt deswegen bei 95%

Nur leider führt ein Löschversuch immer zu eine Auslastung von 100% auf allen 16 CPU Kernen.
Selnst ein "ls" Befehl lässt sich nicht ausführen.

Da der Server produktiv läuft (Webserver) und über 150000 Besucher am Tag abfertigt kann ich den Server nicht vom Netz nehmen oder ein Downtime von mehreren Stunden in Kauf nehmen.

Habt Ihr noch Ideen ?

Grüß
Björn
Mitglied: drnatur
01.02.2013 um 14:07 Uhr
hallo,

vielleicht wäre es eine Idee, ein Löschskript nur für eine best. Zeit laufen zu lassen, z.B. 20 Sekunden und dass dafür dann halt zeitgesteuert, d.h. im 10/20/30 Minuten-Intervall.Da dein Server sowieso immer läuft, dürftest du in einem absehbaren Zeitraum dein Verzeichnis leer bekommen.
also in etwa so (hier gefunden)
#!/usr/sh 
rm -r /verzeichnis-mit-sessionfiles & 
PID=$! 
sleep $(( 10 )) 
kill $PID
und das ganze trägst du dann in eine crontab ein.

liebe Grüße, drnatur
Bitte warten ..
Mitglied: AndiEoh
01.02.2013 um 14:16 Uhr
Hallo

xargs ist dein Freund: http://linux.101hacks.com/linux-commands/xargs-command-examples/

Etwas in der Art von "find <dir-name> -type f -mtime +30 -print0 | xargs -0 rm -f" sollte helfen. Am besten zunächst ohne den "rm -f" Teil testen

Gruß

Andi
Bitte warten ..
Mitglied: 16568
02.02.2013 um 12:43 Uhr
Ich möchte fast wetten, beide genannten Versionen werden weiterhin nur Auslastung bringen.


Lonesome Walker
Bitte warten ..
Mitglied: bblanke
02.02.2013, aktualisiert um 15:43 Uhr
Die Wette hast Du gewonnen !
Hast Du noch eine Idee ?
Bitte warten ..
Mitglied: 16568
02.02.2013 um 23:27 Uhr
Also: das Problem, was die beiden netten Linux-n00bs da oben leider nicht bedacht haben ist doch sehr einfach.

Ein Listing dauert EWIG, ergo wird das Lösch-Script doch besser gleich auf ein entsprechendes Muster angewandt.

Da ich bei Session-Files davon ausgehe, daß diese evtl. nach dem Muster: session_hexadezimaler String
angelegt sind, mußt Du durch einfaches Probieren von:

01.
rm session_00*
oder wenn das zu lange dauert:
01.
rm session_000*
usw. rausbekommen, wann ein Löschen möglich wird.

Tja, und dann packst Du Dir das in ein Bash-Script als Loop, bis er alle wech hat.
Das kann je nach Menge dann schon mal einen Tag dauern, hatte ich auch schon mal.

Passiert meist, wenn der Cron für das Purgen der Sessions nicht mehr aktiv ist.


Lonesome Walker
Bitte warten ..
Mitglied: AndiEoh
03.02.2013 um 13:43 Uhr
Hey Walker n00b

er wollte die Dateien löschen, das dauert bei den üblichen Dateisystemen halt. Deine Idee ist leider auch nur dann besser, wenn man schon weiß wie die Dateien benannt werden und wie viele pro Block auftreten, sonst wird dein rm nach einiger Zeit wegen zuvieler Argumente zurück kommen ohne zu löschen. Außerdem sollte er nicht unbedingt aktuelle Session löschen. Wenn er das Muster erst per ls herausfinden will wird es nichts.

Alles auch schon erlebt und erledigt

Der Linux n00b01

Andi
Bitte warten ..
Mitglied: 16568
03.02.2013 um 17:37 Uhr
Zitat von AndiEoh:
er wollte die Dateien löschen, das dauert bei den üblichen Dateisystemen halt.

Richtig, jedoch nicht auf meine Art und Weise.
Bei Deinem xargs dauert das Listing länger wie das Feedback, wenn er zu viele Argumente dran hat, und dann kürzt.

Deine Idee ist leider auch nur dann
besser, wenn man schon weiß wie die Dateien benannt werden und wie viele pro Block auftreten, sonst wird dein rm nach
einiger Zeit wegen zuvieler Argumente zurück kommen ohne zu löschen.

Richtig, jedoch dauert das max. 60 Sekunden.
Generell weiß man als Server-Admin jedoch, nach welchem Muster seine Session-Files angelegt werden, ansonsten kann man ja nachlesen...

Außerdem sollte er nicht unbedingt aktuelle
Session löschen. Wenn er das Muster erst per ls herausfinden will wird es nichts.

Pfff, wo gehobelt wird, fallen Späne.
Besser ein paar offene Sessions gelöscht als alle Inodes zu, dann geht gar nix mehr, okay?
Und wer sagt Dir, daß Du mit ls nachgucken mußt?
Jede Distri hat ein Schema, nach dem Session-Files angelegt werden.


Lonesome Walker
Bitte warten ..
Mitglied: AndiEoh
04.02.2013 um 10:31 Uhr
Zitat von 16568:
> Zitat von AndiEoh:
> ----
> er wollte die Dateien löschen, das dauert bei den üblichen Dateisystemen halt.

Richtig, jedoch nicht auf meine Art und Weise.
Bei Deinem xargs dauert das Listing länger wie das Feedback, wenn er zu viele Argumente dran hat, und dann kürzt.


Das ist nur korrekt wenn er den *Test* ohne rm gegen das Verzeichnis ausführt. Es ist tatsächlich so das "find" nicht derartig blöde ist die Liste aufzubauen zu sortieren und dann weiter zu reichen wie z.B. "ls" das tun muss. D.h. es findet nicht zuerst ein listing statt und dann wird gelöscht sondern es werden soviele Argumente wie das Environment hergibt von xargs gesammelt und an rm übergeben.

> Deine Idee ist leider auch nur dann
> besser, wenn man schon weiß wie die Dateien benannt werden und wie viele pro Block auftreten, sonst wird dein rm nach
> einiger Zeit wegen zuvieler Argumente zurück kommen ohne zu löschen.

Richtig, jedoch dauert das max. 60 Sekunden.
Generell weiß man als Server-Admin jedoch, nach welchem Muster seine Session-Files angelegt werden, ansonsten kann man ja
nachlesen...


Wenn man als Server-Admin weiß nach welchem Muster die Dateien wo zu welchem Zweck mit welcher Verzeichnis Hashtiefe angelegt werden weiß man auch das man die Dateianzahl begrenzen muß. Falls man das im Notfall nachlesen muß dauert es deutlich länger als 60 Sekunden. Da es wohl ein Webserver ist hängt es auch von der verwendeten Programmiersprache und der Webanwendung ab. Darin dann Blind mit rm und * Pattern drin rum zu löschen ist nicht unbedingt ein Zeichen von tiefergehendem Linux Verständnis.

> Außerdem sollte er nicht unbedingt aktuelle
> Session löschen. Wenn er das Muster erst per ls herausfinden will wird es nichts.

Pfff, wo gehobelt wird, fallen Späne.
Besser ein paar offene Sessions gelöscht als alle Inodes zu, dann geht gar nix mehr, okay?
Und wer sagt Dir, daß Du mit ls nachgucken mußt?
Jede Distri hat ein Schema, nach dem Session-Files angelegt werden.

Es kommt nicht auf die Distri an sondern auf die Programmiersprache (PHP, Perl, Java whatever..) und die Webanwendung. Außerdem ist diese Art der Argumentation warum deine Lösung soviel besser sein soll reichlich dünn.

BTW: Für dich nochmal extra auf einer kleinen Maschine mit 1 Mio. Files getestet

time find /var/lib/filestore/tmp -type f -mmin +1 print0 | xargs -0 rm -f

real 2m50.493s
user 0m4.072s
sys 1m51.407s

Wie die Anzahl der Disk Inodes zeigt wird auch vom ersten Moment an gelöscht, das System zeigt eine Auslastung von max. 16% für "find" und ist bis auf leicht erhöhte I/O-wait Werte Problemlos nutzbar.

Gruß

Andi
Bitte warten ..
Mitglied: 16568
05.02.2013, aktualisiert um 14:04 Uhr
Wie bereits per PN diskutiert:

01.
find <dir-name> -type f -delete
fastest way possible bei möglichst hoher Portabilität :-P


Lonesome Walker
Bitte warten ..
Mitglied: AndiEoh
06.02.2013 um 14:37 Uhr
Zitat von 16568:
Wie bereits per PN diskutiert:

01.
find <dir-name> -type f -delete
fastest way possible bei möglichst hoher Portabilität :-P


Portabilität = GNU find

Die "alten" Unices wie AIX, HP-UX etc. kennen den -delete Schalter nicht, lässt sich aber natürlich per GNU find nachrüsten und spielt hier auch keine Rolle.

Andi
Bitte warten ..
Mitglied: bblanke
08.02.2013 um 12:32 Uhr
Hallo Zusammen,

erstmal Danke für Eure Antworten und Tipps.

Leider hat es nicht zum gewünschten Erfolg geführt !

Gruß
Björn
Bitte warten ..
Mitglied: 16568
08.02.2013 um 15:14 Uhr
Zitat von bblanke:
Leider hat es nicht zum gewünschten Erfolg geführt !

Hm, okay, dann machen wir es mal anders rum:

  • Hast Du den letzten Schnippsel oben getestet (den mit find und -delete, angepaßt auf Dein Verzeichnis natürlich...)?
  • Was sagt cat /etc/debian_version ?
  • Was sagt cat /proc/version ?
  • Welches Verzeichnis willst du leeren ( Standard: /tmp )?
  • Welche Scriptsprache hat die Sessions angelegt (PHP, Perl, Python, Ruby, ...)?
  • Hast Du das Logverzeichnis schon mal ausgemistet oder die Logs zentral an einen Logserver schicken lassen (empfiehlt sich bei so einem Server...)?
  • Hast Du den cronjob schon eingerichtet?


Lonesome Walker
Bitte warten ..
Mitglied: AndiEoh
08.02.2013 um 15:35 Uhr
Vor allem: In welcher Form hat es nicht funktioniert bzw. was war den die Fehlermeldung??
Bitte warten ..
Mitglied: Lochkartenstanzer
08.02.2013 um 15:43 Uhr
Zitat von AndiEoh:
Die "alten" Unices wie AIX, HP-UX etc. kennen den -delete Schalter nicht, lässt sich aber natürlich per GNU
find nachrüsten und spielt hier auch keine Rolle.

ein "-exec rm {} \;" statt "-delete" sollte es auch tun.

lks
Bitte warten ..
Mitglied: Lochkartenstanzer
08.02.2013 um 15:45 Uhr
Zitat von 16568:

* Hast Du den letzten Schnippsel oben getestet (den mit find und -delete, angepaßt auf Dein Verzeichnis natürlich...)?
  • Was sagt cat /etc/debian_version ?
  • Was sagt cat /proc/version ?
  • Welches Verzeichnis willst du leeren ( Standard: /tmp )?
  • Welche Scriptsprache hat die Sessions angelegt (PHP, Perl, Python, Ruby, ...)?
  • Hast Du das Logverzeichnis schon mal ausgemistet oder die Logs zentral an einen Logserver schicken lassen (empfiehlt sich bei so
einem Server...)?
  • Hast Du den cronjob schon eingerichtet?

  • Und welcher Prozeß greift sich denn die CPU?

lks
Bitte warten ..
Mitglied: bblanke
12.02.2013 um 13:43 Uhr
Hallo Zusammen:

Was sagt cat /etc/debian_version ?
6.0.5

Was sagt cat /proc/version ?
Linux version 2.6.32-5-amd64 (Debian 2.6.32-45) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Sun May 6 04:00:17 UTC 2012

Welches Verzeichnis willst du leeren ( Standard: /tmp )?

/data/www/www.meine-domain.tv/_tmp_/

Welche Scriptsprache hat die Sessions angelegt (PHP, Perl, Python, Ruby, ...)?
PHP

Hast Du den cronjob schon eingerichtet?
Nein

Und welcher Prozeß greift sich denn die CPU?

Je nach dem was ich ausführe - mal ls mal rm etc...

Gruß Björn
Bitte warten ..
Mitglied: Lochkartenstanzer
16.02.2013 um 11:53 Uhr
Noch ne frage:

  • Wirkt sich die Auslastung von 100% auf die Antwortzeiten des Servers aus, insbesondere wenn Du den rm/ls-befehl mit nice eine niderigere priorität gibst?

Wenn nicht, würde ich einfach den befehl abschicken udn warten, bis er durch ist.

Ansonsten könntest Du eventuell mit cpuset versuchen, den load auf einige wenige Cores zu beschränken.

lks
Bitte warten ..
Mitglied: bblanke
16.02.2013 um 13:50 Uhr
Hey LKS,

also ein absetzen des rm mit nice führt zum selben Ergebnis.
Nach ca. 3 Sekunden sind alle Seiten auf dem Server nicht mehr erreichbar.

Gruß
Björn
Bitte warten ..
Mitglied: Lochkartenstanzer
17.02.2013, aktualisiert um 10:58 Uhr
versuch mal

find  /data/www/www.meine-domain.tv/_tmp_/ -type f -exec rm -v {} \; -exec  sleep 0.1 \;
oder
find  /data/www/www.meine-domain.tv/_tmp_/ -type f -exec rm -v {} \; -exec  sleep 1.0 \;
Wenn das damit klappt, kannst Du den Parameter von sleep sukzessive herunterschrauben. Andererseits, wenn keine neuen Dateien dazukommen und Du Zeit hast (je nach Variante 29h oder 12d bei 2^20 Dateien), sind die Dateien mit diesem Verfahren auch weg.

lks
Bitte warten ..
Mitglied: Ernestos
23.02.2014, aktualisiert um 13:55 Uhr
Ich hatte auch gerade das Problem,
Meine Lösung:

01.
mkdir /var/lib/php/session_new 
02.
chown apache:apache /var/lib/php/session_new 
03.
chmod 1777 /var/lib/php/session_new 
04.
 
05.
mv /var/lib/php/session /var/lib/session_old 
06.
mv /var/lib/php/session_new /var/lib/php/session
Dann habe ich mir folgendes Script geschrieben:

01.
#!/bin/bash 
02.
# Löschen von Millionen von PHP Session Files 
03.
array=( 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z ) 
04.
array2=( 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z ) 
05.
array3=( 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z ) 
06.
for i in "${array[@]}" 
07.
do 
08.
        for e in "${array2[@]}" 
09.
        do 
10.
 
11.
                for f in "${array3[@]}" 
12.
                do 
13.
                        find /var/lib/php/session_old/sess_$i$e$f* -type f | xargs -n5000 -P5 rm -f 
14.
                        echo sess_$i$e$f* erfolgreich gelöscht 
15.
                        sleep 10 
16.
                done 
17.
        done 
18.
done
Das ganze dann mit (wenn das pwd das Verzeichnis des Scriptes ist)
01.
./delete.sh 

starten.

Bei mir lief es dadurch ohne große Serverauslastung durch.

Keine Gewährleistung oder Garantie auf Richtgigkeit.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Entwicklung
Versteckte .(Punkt)Dateien löschen (3)

Frage von DarkJM zum Thema Entwicklung ...

Batch & Shell
gelöst Powershell ältere Dateien löschen (6)

Frage von Cougar77 zum Thema Batch & Shell ...

Debian
Debian Zugriff auf gelöschte Dateien entfernen (6)

Frage von kaihummels zum Thema Debian ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...