PowerShell Script um Quest-Migration-Manager Datenbank aufzuräumen
Das folgende Script löscht Einträge aus der Ressource Processing Datenbank des Quest Migration Manager, die älter als 3 Monate sind:
# Bitte unter dem Namen cleanQuestDB.ps1 abspeichern, damit das u.a. Beispiel passt
param(
[String]$Server=“localhost“,
[int]$Port=50000,
[int]$Month=3,
[String]$LogPath=“~\Desktop\DeletedQuestDBEntries.log“
)
Import-Module ActiveDirectory
$ErrorActionPreference=“SilentlyContinue“
Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase *
$Root=($Error[0] | select -expandprop Exception | select -expandprop message).split(„:“)[1].split(„,“)[-1].substring(1).trimend(„‚.“)
$ErrorActionPreference=“Continue“
$Project=(Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase $Root -searchscope Onelevel | ? {$_.ObjectClass -eq „aelita-Amm-Workspace“}).Distinguishedname
$ComputerLogCollection=Get-ADObject -filter * -server „$($Server):$($Port)“ -searchbase „cn=Computers,cn=ResourceProcessing,$Project“ -searchscope onelevel -properties aelita-Amm-LastOperationTime,aelita-Amm-Name
$TimeSpan=(get-date)-(new-timespan -days ($Month*30))
$ToDelete=@()
$TotalCounter=$ComputerLogCollection.count
$DeleteCounter=0
„Searching Database. Please be patient!“
foreach ($Item in $ComputerLogCollection) {
$Timestamp=$Item | select -expandprop aelita-Amm-LastOperationTime
if ($Timestamp -and $Timestamp -lt $TimeSpan) {
$ToDelete+=$Item
$DeleteCounter++
}
}
if ((read-host -prompt „$DeleteCounter from $TotalCounter to delete, proceed (Yes/No)“) -notlike „Y*“) {„Aborted!“;exit}
„Deleted Entries of Questdatabase“ > $LogPath
„Run from: $(get-date)“ >> $LogPath
foreach ($Item in $ToDelete) {
$Name=$Item | select -expandprop aelita-Amm-Name
$Timestamp=$Item | select -expandprop aelita-Amm-LastOperationTime
„Deleting $Name from $Timestamp“ | tee $LogPath -Append
$Item | Remove-ADObject -Recursive -confirm:$false
}
Im einfachsten Fall starten Sie einfach das Script. Zunächst wird geschaut wieviele Einträge insgesamt vorhanden sind und wieviele davon gelöscht werden würden. Dann fragt es, ob Sie den Vorgang durchführen möchten und listet Ihnen die entsprechenden Objekte auf. Nebenbei werden diese Angaben in eine LogDatei auf Ihrem Desktop protokolliert. Sie können das Skript natürlich auch mit anderen Parametern aus dem Parameter Block aufrufen, wie z.B.:
./cleanQuestDB.ps1 -Server QuestServer -Port 40000 -Month 2 -LogPath C:\Quest.log
Voraussetzungen:
PowerShell 2.0 oder höher
AD-Modul verfügbar
Der Benutzer unter dem das Script läuft benötigt Vollzugriff auf die Quest-Datenbank
Muss mit erhöhten Rechten (UAC – Benutzerkontensteuerung) ausgeführt werden
WINSAT liefert „Mondwerte“
Wenn winsat zuverlässige Werte liefern würde, wäre es echt ein cooles Tool. Winsat ist ein Windows Bordmittel um auf der Kommandozeile Leistungsdaten von CPU, Festplatte und vielen anderen Dingen zu erfassen. Das habe ich doch gleich einmal an einem Einzelplatzsystem ausprobiert:
Hier fällt schon bei den ersten beiden Messungen auf, dass Winsat würfelt. Der erste Test war ein Lesezugriff der 17 Sekunden benötigt hat und dabei angeblich eine Transferrate von 128 MB/s (bitte vergeben Sie mir die Rundungsungenauigkeit 😉 ). Der zweite Test war ein Schreibtest mit derselben Datenmenge auf demselben Laufwerk. Der braucht wie erwartet länger, als der Lesetest nämlich 37 Sekunden, also 20 Sekunden mehr. Witzig daran ist, dass der Durchsatz dabei angeblich auf stolze 435 MB/s gestiegen ist. Eine Festplatte, die 4 x so schnell schreibt wie liest. Ich glaube ich sollte meinen PC patentieren lassen oder einem Museum übergeben. Das Beste daran ist, das er sogar auf 1464 MB/s hoch geht. Schade ist nur, dass die Werte wohl kaum der Realität entsprechen.
Pagerank durch mehr Geschwindigkeit verbessern
U. a. bewertertet Google die Geschwindigkeit mit der Websites ausgeliefert werden. Es gibt einen Haufen Verbesserungen um die Geschwindigkeit der Website zu steigern. Welches Tuningpotential in Ihrer Website steckt finden Sie unter:
https://developers.google.com/pagespeed
heraus. Um das CMS/Blogsystem Wordpress zu tunen schauen Sie in diesen Artikel.
Soll ich bei IIS 7.x den Usermode-, oder den Kernelmodecache aktivieren, oder beide?
Die Antwort lautet wie üblich: Es kommt ganz darauf an! 😉
Fakten: Kernelmodecache ist schneller als Usermodecache, da ein Übergang in den Usermode immer viel Zeit kostet! Wenn ein Webserver im Normalfall ca. 550/s Anfragen schafft, so werden daraus bei aktiviertem Usermodecache ca. 650/s, bei Kernelcache 950/s. Aktiviert man bei geht er knapp über 1000/s. Allerdings hat man dafür nicht immer genug Speicherreserven.
Des Weiteren ist es davon abhängig wie IIS mit der jeweiligen Website arbeitet. Wird von der Webanwendung mehr im Usermode gearbeitet, ist es sinnvoller den Usermodecache zu aktivieren, arbeitet Sie mehr im Kernelmode, natürlich lieber den Kernelcache. Dazu muss man allerdings wissen, wie die jeweilige Webanwendung tickt. Das verrät der folgende Powershell-Befehl:
Get-WmiObject win32_process | ? {$_.caption -eq "w3wp.exe"} | select commandline,usermodetime,kernelmodetime | fl
Ausgabe sind alle Workerprozesse vom IIS. Dabei wird als erstes angezeigt, welcher Applicationpool sich hinter dem Workerprocess versteckt und danach folgen die Zeiten die er sich im User und im Kernelmode aufhält. Anhand dieser Zahlen kann man sehr schön festlegen, welche Cacheart die sinnvollere für den jeweiligen Applicationpool und den damit verknüpften Websites ist. Zugegeben ,man hätte das ganze noch viel eleganter Lösen können am besten gleich mit der automatischen Cachekonfiguration. Aber das war eben mal so auf die Schnelle Quick & Dirty eben ;-).
Schnelle Powershell Befehle anhand des Beispiels grep
Hier ein Quick&Dirty Beispiel wie man schnelle Powershellscripte schreibt um die eigenen Scripte ordentlich zu tunen. Unter Powershell gibt es zwar mit select-object und where-object als auch select-string einem grep aus dem UNIX- bzw. LINUX-Bereich ähnliche Befehle, doch so wirklich Bash-Gefühle kommen dabei nicht auf. Einen ersten Turbo können Sie einschalten, wenn Sie Parameter wie -inculde, -exclude oder -filter des jeweiligen Befehls verwenden, statt den Befehl alle Informationen beschaffen zu lassen und diese hinterher mit dem where-object auszuwerten. Vielleicht kennen Sie die Möglichkeit eine Funktion zu schreiben. Schneller funktioniert aufgrund des Streaming-Modus jedoch ein Filter. Wenn Sie dasselbe Script noch einmal mit dem Stichwort function statt filter einleiten können Sie das Laufzeitverhalten sehr schön überprüfen indem Sie den Befehl ls c: -recurse | grep suchbegriff aufrufen. Schauen Sie sich auch im Taskmanager ruhig einmal den Speicherverbrauch an!
filter grep ($suchbegriff) { $_ | out-string -stream | select-string $suchbegriff # Etwas aufwändiger, doch dafür werden die Objekte nicht als String, sondern nach wie vor als Objekt zurück gegeben mit folgender Zeile: # if (@($_ | out-string -stream | select-string $suchbegriff -simplematch).count -gt 0) {$_} }
Bei function wird der Befehl vor der Pipe erst einmal alle Daten (im obigen Beispiel alle Dateinamen) in einen Puffer schreiben. Erst wenn alle Dateien von Lw. C: im Puffer sind wird dieser an die Funktion nach der Pipe übergeben. Das out-string -stream hat damit allerdings nichts zu tun! Durch die Einleitung mit filter nimmt unser grep allerdings schon die Eingaben von ls entgegen sobal der erste Dateiname vorliegt. Die beiden Kommandos arbeiten also parallel. Das führt zu weniger Speicherverbrauch und zu schnelleren Ergebnissen.
Wer das Tuning auf die Spitze treiben möchte greift dennoch wieder zu einer Funktion. Denn filter schreibt auch eine function nur bettet er automatisch den kompletten Code in einen process Block ein. Das Beispiel:
function { process{ # mein code } }
ist also dasselbe wie:
filter { # mein code }
In Ihrer Funktion gibt es aber vielleicht Dinge die nur 1 x zu Beginn und 1 x am Ende durchgeführt werden müssen, während die eigentliche Verarbeitung für alle übergebenen Objekte durchgeführt werden müssen. Bei einem filter würde immer komplett alles durchlaufen werden.
function { begin { # Hier könnten Sie z. B. den aktuellen Verzeichnispfad, oder andere Ausgangsbedingungen in eine Variable retten bevor Sie zu wüten anfangen } process { # Hier findet die eigentlich Verarbeitung statt. Möglicher Weise benutzen Sie cd um Verzeichnisse zu wechseln etc... } end { # Wechseln Sie wieder in das ursprüngliche Verzeichnis zurück geben Sie Variablen frei und führen Sie weitere "Aufräumvorgänge" durch } }
Der Code bei begin würde also bei der ersten Objektübergabe erfolgen. Für alle weiteren Objekte würde nur noch der Code im Bereich process ausgeführt werden. Nach der Verarbeitung des letzten Objekts würde schließlich der Code unter end ausgeführt werden.
Möchten Sie Ihre Funktion dauerhaft verfügbar haben, sollten Sie diesen in eine Datei namens profile.ps1 schreiben und im Verzeichnis C:\Windows\System32\WindowsPowerShell\v1.0 ablegen, wenn er allen Benutzern des Computers zur Verfügung stehen soll. Wenn es nur für Ihren Benutzer sein soll, dann unter C:\Users\Ihr Benutzername\Documents\WindowsPowerShell.
Wenn Sie Daten von anderen Computern sammeln und auswerten, dann lassen Sie die Auswertung auf den anderen PCs laufen und holen Sie sich nur die Ergebnisdaten ab.
Langsam:
invoke-command {get-process} -computer name1,name2,name3 | where-object {$_.VM -gt 30MB} | sort PSComputerName | select Name,VM
Schnell:
invoke-command {get-process | select Name,VM | where-object {$_.VM -gt 30MB}} -computer name1,name2,name3 | sort PSComputerName
Des Weiteren gibt es für invoke-command den Parameter -throttlelimit. Dieser gibt an wieviele Computer gleichzeitig abgefragt werden. Der Standardwert ist 32. Je nach Aufgabe kann es sich lohnen mehr oder weniger Rechner anzugeben.
Der Befehl measure-command {Ihre Befehle oder Script} gibt Auskunft über die Zeit die Ihr Script zur Ausführung gebraucht hat.
Desktopumgebung unter Linux beschleunigen
Mit cgroups (Control Grouops) lassen sich die Ressourcen (CPU,Speicher,Festplatte,Netzwerk, etc..) den Anwendungen zuteilen. Dadurch können Priorisierungen vorgenommen werden. Das komplette Thema hier ab zu handeln wäre zu umfangreich. Aber zum Glück gibt es auch eine automatische Konfiguration die ebenfalls eine spürbare Beschleunigung des Desktops ähnlich wie bei Vista -> Windows 7 ermöglicht.
Dazu müssen Sie zunächst das entsprechende Paket installieren.
Debian basierte Systeme (Ubuntu, Knoppix und Kosorten):
apt-get install cgroup-bin
Red Hat basierte Systeme (SuSE, Fedora und Co.):
zypper install cgroup-bin (SuSE)
yum install cgroup-bin (alle anderen)
Mit lssubsys können Sie feststellen, ob die Ressourcen bereits eingerichtet wurden. Auch das Verzeichnis /sys/fs/cgroup müsste entsprechend „bevölkert“ sein.
Ob sich das System auf Autopilot befindet sehen Sie mit cat /proc/sys/kernel/sched_autogroup_enabled. Kommt eine 1 raus ist der Autopilot an – bei 0 aus.