Resourcenüberwachung

Ereignisse, Vorschläge und Aktionen

Resourcenüberwachung

Beitragvon datengrab » Mo Apr 28, 2008 8:28 pm

Ich wollte mich mal an der Ressourcenüberwachung für RAM und Plattenplatz versuchen. Da dazu wahrscheinlich auf Dauer viele Fragen (meinerseits) kommen werden mache ich dafür mal ein eigenes Thema auf.

Ich plane die Überwachung als eigenen Thread aus dem plasmaSwichtchboard heraus zu starten. Jetzt darf ich ja für die Methode deployThread / initialMemoryPreRequisite angeben, was ich als mindest Speicherverbrauch für einen Lauf des Threads einplane. Wie komme ich an diesen Wert? Einfach schätzen??
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Orbiter » Mo Apr 28, 2008 10:28 pm

das ist die Größe des RAM den dein Prozess zum einmaligen Durchlaufen benötigt. Kannst du ja abschätzen.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Resourcenüberwachung

Beitragvon datengrab » Di Apr 29, 2008 9:02 pm

Orbiter hat geschrieben:das ist die Größe des RAM den dein Prozess zum einmaligen Durchlaufen benötigt.
Das habe ich mir so schon gedacht
Kannst du ja abschätzen.
Dazu sollte ich erst mal wissen, wie groß Datentypen in Java sind. Bislang habe ich dazu noch nichts vernünftiges gefunden. Ich vermute mal für die fundamentalen Datentypen einen long als Typenkennung und einen weiteren long für den Wert. Bei allen anderen Typen einen long für den Datentyp und einen Zeiger auf die eigentlichen Daten. Bei denen geht es dann in gleicher weise wieder los. Halbwegs richtig?

Aber dann habe ich noch eine andere Sache: in der Festplattenüberwachung die ich geschickt hatte, interiere ich über das DATA-Verzeichniss um zu sehen, welche Volumes in gebrauch sind. Nun bin ich vorhin in plasmaSwitchboard ab Zeile 974 darauf gestoßen, dass die ganzen Verzeichnisse über die Config auf andere Bereiche des Dateibaums gemapt werden können. Folglich sollte die Daten aus der Config auch so in der Festplattenüberwachung genutzt werden, oder?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Do Mai 01, 2008 4:46 pm

Ich habe eine erste einfach Version der Resourcenüberwachung fertig gestellt. Diese gibt es als patch auf 4751 unter http://det.cable.nu/yacy/resourceobserver.diff.txt

Sie kontrolliert alle fünf Minuten den freien Speicherplatz aller von yacy genutzten Laufwerke. Sobald er auf einem der beteiligten Laufwerke unter 5% sinkt, wird das crawlen (auch remote) abgeschaltet und auf der Statusseite erscheint einen Warnmeldung.

Limitierungen:
  • läuft momentan nur unter unixoiden Systemen (linux funktioniert, OS X und *BSD sollten funktionieren (wenn nicht bitte feedback)). Da ich selbst kein Windows besitze muss diese Implementierung jemand anders übernehmen.
  • wenn die Verzeichnisse unterhalb von DATA über die Konfiguration auf Bereiche außerhalb von DATA gemapt werden wird das momentan noch nicht erkannt
  • eine Überwachung des RAM findet noch nicht statt
  • die in einem anerden Thema gewünschte Separierung von DATA/HTCACHE findet noch nicht statt
  • das Stoppen anderer Speicherfresser wie DHT-in findet noch nicht statt.
  • momentan gibt es noch keinerlei Einstellungsmöglichkeiten
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Mo Jun 02, 2008 11:10 pm

Ich habe eine neue Version fertig gestellt, die mit den meisten Unzulänglichkeiten der letzten Version ausräumt. Es ist ein diff auf 0.587/04874. Momentan wird noch nur der Festplattenplatz überwacht. Die Funktion wurde dahin gehend geändert, das auf allen beteiligten Laufwerken jeweils mindestens 100MB frei sein müssen.

datengrab hat geschrieben:[*]läuft momentan nur unter unixoiden Systemen (linux funktioniert, OS X und *BSD sollten funktionieren (wenn nicht bitte feedback)). Da ich selbst kein Windows besitze muss diese Implementierung jemand anders übernehmen.

Der dranklebende Patch sollte jetzt mit so ziemlich allen aktuellen Unixodien Systemen funktionieren. Mit folgenden Systemen habe ich es entweder ausprobiert oder mit der Doku abgeglichen:
AIX
BS2000/OSD
*BSD
HAIKU
HP_UX
TRU64
IRIX
LINUX
MAC_OS_X
MINIX
SOLARIS
UNICOS

Unter Windows sollte es eigentlich funktionieren. Da ich keine Windows besitze habe ich Vorstufen unter wine erfolgreich getestet. YaCy komplett unter wine zu starten funktioniert leider nicht, da schon beim Start DB-Fehler zum Abbruch führen. Hier bin ich auf Feedback angewiesen.

Wenn ein Betriebssystem nicht erkannt wird erscheint eine entsprechende Meldung im Log.
  • wenn die Verzeichnisse unterhalb von DATA über die Konfiguration auf Bereiche außerhalb von DATA gemapt werden wird sollte das momentan noch nicht erkannt

Sollte funktionieren
  • eine Überwachung des RAM findet noch nicht statt
  • die in einem anerden Thema gewünschte Separierung von DATA/HTCACHE findet noch nicht statt
  • das Stoppen anderer Speicherfresser wie DHT-in findet noch nicht statt.
  • momentan gibt es noch keinerlei Einstellungsmöglichkeiten

ToDo

Code: Alles auswählen
diff -w -B -N -r -u -x yacy.init -x '*yacy.java' -x '*.jar' -x '*DATA*' -x '*RELEASE*' -x '*.class' -x .svn yacy-svn/htroot/Status.html yacy-work/htroot/Status.html
--- yacy-svn/htroot/Status.html   2008-05-27 19:33:43.766091127 +0200
+++ yacy-work/htroot/Status.html   2008-06-02 11:59:05.261516700 +0200
@@ -82,6 +82,14 @@
     </dd>

     #(/warningStatusJunior)#

     

+    #(warningDiskSpaceLow)#::

+    <dt class="hintIcon"><img src="env/grafics/bad.png" width="32" height="32" alt="bad"/></dt>

+    <dd class="hint">On at least of the YaCy used harddrives the left space is to low

+    (under #[minSpace]#). Because of this all crawling has been disabled. Please fix

+    this as soon as possible and then restart YaCy.   

+    </dd>

+    #(/warningDiskSpaceLow)#

+   

      <!-- hints -->

     

     #(hintVersionAvailable)#::

diff -w -B -N -r -u -x yacy.init -x '*yacy.java' -x '*.jar' -x '*DATA*' -x '*RELEASE*' -x '*.class' -x .svn yacy-svn/htroot/Status.java yacy-work/htroot/Status.java
--- yacy-svn/htroot/Status.java   2008-05-27 19:33:43.886091081 +0200
+++ yacy-work/htroot/Status.java   2008-06-02 12:04:20.895347214 +0200
@@ -64,6 +64,7 @@
import de.anomic.yacy.yacyCore;

import de.anomic.yacy.yacySeed;

import de.anomic.yacy.yacyVersion;

+import de.anomic.yacy.resourceObserver;



public class Status {



@@ -138,6 +139,15 @@
             prop.put("protection", "1"); // protected

         }

         

+        // free disk space

+        if ((adminaccess) && (!sb.observer.getDisksOK()))

+        {
+            String minFree = serverMemory.bytesToString(sb.observer.getMinFreeDiskSpace());
+            prop.put("warningDiskSpaceLow", "1");
+            prop.put("warningDiskSpaceLow_minSpace", minFree);

+        }

+       

+       

         // version information

         String versionstring = yacyVersion.combined2prettyVersion(sb.getConfig("version","0.1"));

         prop.put("versionpp", versionstring);

diff -w -B -N -r -u -x yacy.init -x '*yacy.java' -x '*.jar' -x '*DATA*' -x '*RELEASE*' -x '*.class' -x .svn yacy-svn/source/de/anomic/plasma/plasmaSwitchboard.java yacy-work/source/de/anomic/plasma/plasmaSwitchboard.java
--- yacy-svn/source/de/anomic/plasma/plasmaSwitchboard.java   2008-05-27 19:34:04.490094368 +0200
+++ yacy-work/source/de/anomic/plasma/plasmaSwitchboard.java   2008-06-02 15:59:01.733383051 +0200
@@ -164,6 +164,7 @@
import de.anomic.server.logging.serverLog;

import de.anomic.tools.crypt;

import de.anomic.tools.nxTools;

+import de.anomic.yacy.resourceObserver;

import de.anomic.yacy.yacyClient;

import de.anomic.yacy.yacyCore;

import de.anomic.yacy.yacyNewsPool;

@@ -225,6 +226,7 @@
     public  plasmaParser                   parser;

     public  volatile long                  proxyLastAccess, localSearchLastAccess, remoteSearchLastAccess;

     public  yacyCore                       yc;

+    public  resourceObserver               observer;

     public  userDB                         userDB;

     public  bookmarksDB                    bookmarksDB;

     public  plasmaWebStructure             webStructure;

@@ -421,6 +423,20 @@
     public static final String CLEANUP_IDLESLEEP            = "90_cleanup_idlesleep";

     public static final String CLEANUP_BUSYSLEEP            = "90_cleanup_busysleep";

     

+    // 92_resourceobserver
+    /**
+     * <p><code>public static final String <strong>RESOURCEOBSERVER</strong> = "92_resourceobserver"</code></p>
+     * <p>The observer thread which is checks resource consumption of RAM and disk space.</p>
+     */
+    public static final String RESOURCEOBSERVER                      = "92_resourceobserver";
+    public static final String RESOURCEOBSERVER_MEMPREREQ            = "92_resourceobserver_memprereq";
+    public static final String RESOURCEOBSERVER_METHOD_START         = "resourceObserverJob";
+    public static final String RESOURCEOBSERVER_METHOD_JOBCOUNT      = null;
+    public static final String RESOURCEOBSERVER_METHOD_FREEMEM       = null;
+    public static final String RESOURCEOBSERVER_IDLESLEEP            = "92_resourceobserver_idlesleep";
+    public static final String RESOURCEOBSERVER_BUSYSLEEP            = "92_resourceobserver_busysleep";
+
+   

     //////////////////////////////////////////////////////////////////////////////////////////////

     // RAM Cache settings

     //////////////////////////////////////////////////////////////////////////////////////////////

@@ -1111,6 +1127,9 @@
             this.log.logSevere("Unable to load wiki parser, the wiki won't work", e);

         }

         

+        // initializing the resourceObserver
+        this.observer = new resourceObserver(this);
+       

         // initializing the stackCrawlThread

         this.crawlStacker = new CrawlStacker(this, this.plasmaPath, (int) getConfigLong("tableTypeForPreNURL", 0), (((int) getConfigLong("tableTypeForPreNURL", 0) == 0) && (getConfigLong(CRAWLSTACK_BUSYSLEEP, 0) <= 100)));

         //this.sbStackCrawlThread = new plasmaStackCrawlThread(this,this.plasmaPath,ramPreNURL);

@@ -1164,6 +1183,14 @@
             Long.parseLong(getConfig(INDEX_DIST_BUSYSLEEP , "0")),

             Long.parseLong(getConfig(INDEX_DIST_MEMPREREQ , "1000000")));



+        deployThread(RESOURCEOBSERVER, "Resource Observer", "thread which checks resource consumption of RAM and disk space", null,
+            new serverInstantBusyThread(observer, RESOURCEOBSERVER_METHOD_START, RESOURCEOBSERVER_METHOD_JOBCOUNT, RESOURCEOBSERVER_METHOD_FREEMEM), 60000,
+            Long.parseLong(getConfig(RESOURCEOBSERVER_IDLESLEEP , "30000")),
+            Long.parseLong(getConfig(RESOURCEOBSERVER_BUSYSLEEP , "30000")),
+            Long.parseLong(getConfig(RESOURCEOBSERVER_MEMPREREQ , "10000")));
+
+
+

         // test routine for snippet fetch

         //Set query = new HashSet();

         //query.add(plasmaWordIndexEntry.word2hash("Weitergabe"));

diff -w -B -N -r -u -x yacy.init -x '*yacy.java' -x '*.jar' -x '*DATA*' -x '*RELEASE*' -x '*.class' -x .svn yacy-svn/source/de/anomic/tools/diskUsage.java yacy-work/source/de/anomic/tools/diskUsage.java
--- yacy-svn/source/de/anomic/tools/diskUsage.java   1970-01-01 01:00:00.000000000 +0100
+++ yacy-work/source/de/anomic/tools/diskUsage.java   2008-06-02 16:56:27.166664997 +0200
@@ -0,0 +1,446 @@
+// diskUsage.java
+// -----------------------
+// part of YaCy
+// (C) by Detlef Reichl; detlef!reichl()gmx!org
+// Pforzheim, Germany, 2008
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Using this software in any meaning (reading, learning, copying, compiling,
+// running) means that you agree that the Author(s) is (are) not responsible
+// for cost, loss of data or any harm that may be caused directly or indirectly
+// by usage of this softare or this documentation. The usage of this software
+// is on your own risk. The installation and usage (starting/running) of this
+// software may allow other people or application to access your computer and
+// any attached devices and is highly dependent on the configuration of the
+// software which must be done by the user of the software; the author(s) is
+// (are) also not responsible for proper configuration and usage of the
+// software, even if provoked by documentation provided together with
+// the software.
+//
+// Any changes to this file according to the GPL as documented in the file
+// gpl.txt aside this file in the shipment you received can be done to the
+// lines that follows this copyright notice here, but changes must not be
+// done inside the copyright notive above. A re-distribution must contain
+// the intact and unchanged copyright notice.
+// Contributions and changes to the program code must be marked as such.
+
+
+// The HashMap contains the following values:
+//
+// key        = the device name e.g. /dev/hda1, on windows the drive e.g. c:
+// value[0]   = the total space of the volume, on windows not used
+// value[1]   = the free space of the volume
+
+package de.anomic.tools;
+
+import java.lang.String;
+import java.lang.Long;
+import java.lang.ProcessBuilder;
+import java.lang.Process;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileNotFoundException;
+
+import de.anomic.plasma.plasmaSwitchboard;
+
+public class diskUsage {
+
+    private static final HashMap<String, long[]> diskUsage = new HashMap<String, long[]>();
+   
+    private static final ArrayList<String> allVolumes = new ArrayList<String>();
+    private static final ArrayList<String> allMountPoints = new ArrayList<String>();
+    private static final ArrayList<Boolean> usedVolumes = new ArrayList<Boolean>();
+   
+    private static final ArrayList<String> yacyUsedVolumes = new ArrayList<String>();
+    private static final ArrayList<String> yacyUsedMountPoints = new ArrayList<String>();
+   
+    private static plasmaSwitchboard sb;
+    private static int usedOS;
+    private static boolean usable;
+    private static String windowsCommand;
+    private static String errorMessage;
+   
+
+        // Unix-like
+    private final int AIX = 0;                    // IBM
+    private final int BS2000 = 1;                 // Fujitsu Siemens (oficial BS2000/OSD)
+    private final int BSD = 2;                    // all kind of BSD
+    private final int HAIKU = 3;                  // like BeOS; does not have a JRE til now, but they are working on it
+    private final int HP_UX = 4;                  // Hewlett-Packard
+    private final int TRU64 = 5;                  // Hewlett-Packard
+    private final int IRIX = 6;                   // sgi
+    private final int LINUX = 7;                  // all kind of linux
+    private final int MAC_OS_X = 8;               // Apple
+    private final int MINIX = 9;                  // don't know if there even is a JRE for minix...
+    private final int SOLARIS = 10;               // SUN  The latest SunOS version is from 1990 and that is much
+                                                  //      older as Java 1.5. So we can ignore it.
+    private final int UNICOS = 11;                // cray
+
+    private final int UNIX_END = UNICOS;
+
+        // Windows dos based
+    private final int WINDOWS_95 = 12;
+    private final int WINDOWS_98 = 13;
+    private final int WINDOWS_ME = 14;
+   
+        // Windows WinNT based
+    private final int WINDOWS_NT = 15;
+    private final int WINDOWS_2000 = 16;
+    private final int WINDOWS_XP = 17;
+    private final int WINDOWS_SERVER = 18;
+    private final int WINDOWS_VISTA = 19;
+   
+    String[] OSname =   {"aix", "bs2000", "bsd", "haiku", "hp-ux", "tru64", "irix", "linux", "mac os x", "minix",
+                         "solaris", "unicos",
+                         "windows 95", "windows 98", "windows me",
+                         "windows nt", "windows 2000", "windows xp", "windows server", "windows vista"};
+   
+    //////////////////
+    //  public API  //
+    //////////////////
+
+    public diskUsage (plasmaSwitchboard sb) {
+        errorMessage = null;
+        this.sb = sb;
+        usedOS = getOS();
+        if (usedOS == -1) {
+            usable = false;
+        } else {
+            usable = true;
+
+            // some kind of *nix
+            if (usedOS <= UNIX_END) {
+                dfUnix (true);
+                for (int i = 0; i < allMountPoints.size(); i++){
+                    usedVolumes.add(false);
+                }
+               
+                checkVolumesInUseUnix ("DATA");
+                checkMapedSubDirs ();
+               
+                for (int i = 0; i < allVolumes.size(); i++){
+                    if (usedVolumes.get(i) == true) {
+                        yacyUsedVolumes.add(allVolumes.get (i));
+                        yacyUsedMountPoints.add(allMountPoints.get (i));
+                    }
+                }
+
+            // all Windows version
+            } else {
+                checkWindowsCommandVersion();
+                getAllVolumesWindows ();
+                checkStartVolume();
+                checkMapedSubDirs ();
+                for (int i = 0; i < allVolumes.size(); i++){
+                    if (usedVolumes.get(i) == true)
+                        yacyUsedVolumes.add(allVolumes.get (i));
+                }
+            }
+            if (yacyUsedVolumes.size() < 1)
+                usable = false;
+        }
+    }
+
+    public HashMap<String, long[]> getDiskUsage () {
+        if (!usable)
+            return null;
+       
+        if (usedOS <= UNIX_END)
+            dfUnix(false);
+        else
+            dfWindows ();           
+        return diskUsage;
+    }
+
+    public boolean getUsable () {
+        return usable;
+    }
+   
+    public String getErrorMessage () {
+        return errorMessage;
+    }
+   
+    public int getNumUsedVolumes () {
+        return yacyUsedVolumes.size();
+    }
+
+
+
+
+    ////////////
+    //  Unix  //
+    ////////////
+
+    private void dfUnix(boolean getVolumesOnly) {
+        if (!getVolumesOnly)
+            diskUsage.clear ();
+
+        // -k    set blocksize to 1024
+        //   confirmed with tests:
+        //     Linux
+        //   verified with man pages or other docs:
+        //     AIX, BS2000, *BSD, HP-UX, IRIX, minix, Mac OS X, Solaris, Tru64, UNICOS
+
+        // -l    list local filesystems only
+        //   confirmed with tests:
+        //     Linux
+        //   verified with man pages or other docs:
+        //     AIX, BS2000, *BSD, HP-UX, IRIX, minix, Mac OS X, Solaris, UNICOS
+       
+        // please report all successes or fails for non-confirmed systems to
+        // detlef!reichl()gmx!org. Thanks!
+       
+        ArrayList<String> processArgs = new ArrayList<String>();
+        processArgs.add("df");
+        processArgs.add("-k");
+        // Some systems need the additional -P parameter to return the data in Posix format.
+        // Without it the mount point will be in the 7th and not in the 6th column
+        if (usedOS == AIX || usedOS == BS2000 || usedOS == MINIX || usedOS == UNICOS)
+            processArgs.add("-P");
+        // Tru64 does not know the -l parameter
+        // For haiku i didn't found online docs at all; so better exclude it
+        if (usedOS != TRU64 && usedOS != HAIKU)
+            processArgs.add("-l");
+
+        ProcessBuilder processBuilder = new ProcessBuilder(processArgs);
+        Process process;
+        try {
+            process = processBuilder.start();
+        } catch (IOException e){
+            errorMessage = "The system command df returned with an error";
+            usable = false;
+            return;
+        }
+       
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader (process.getInputStream ()));
+        String line;
+        while (true) {
+            try {
+                line = bufferedReader.readLine ();
+            } catch (IOException e) {
+                usable = false;
+                return;
+            }
+            if (line == null)
+                break;
+              if (! line.startsWith ("/"))
+                continue;
+            String[] tokens = line.split(" ++", 6);
+            if (tokens.length < 6)
+                continue;
+nextLine:
+            if (getVolumesOnly) {
+                for (int i = 0; i < allMountPoints.size(); i++) {
+                    if (tokens[5].trim().compareTo(allMountPoints.get(i)) > 0) {
+                        allMountPoints.add(i, tokens[5].trim());
+                        allVolumes.add(i, tokens[0]);
+                        break nextLine;
+                    }
+                }
+                allMountPoints.add(allMountPoints.size(), tokens[5]);
+                allVolumes.add(allVolumes.size(), tokens[0]);
+            } else {
+                for (int i = 0; i < yacyUsedVolumes.size(); i++){
+                    if (yacyUsedVolumes.get(i).equals(tokens[0])) {
+                        long[] vals = new long[2];
+                        try { vals[0] = new Long(tokens[1]); } catch (NumberFormatException e) { break nextLine; }
+                        try { vals[1] = new Long(tokens[3]); } catch (NumberFormatException e) { break nextLine; }
+                        vals[0] *= 1024;
+                        vals[1] *= 1024;
+                        diskUsage.put (yacyUsedMountPoints.get(i), vals);
+                    }
+                }
+            }
+        }
+    }
+
+
+
+    private void checkVolumesInUseUnix (String path) {
+        File file = new File(path);
+        File[] fileList = file.listFiles();
+        String base;
+        String dir;
+       
+        for (int i = 0; i < fileList.length; i++) {
+            if (fileList[i].isDirectory()) {
+                try {
+                    dir = fileList[i].getCanonicalPath();
+                } catch (IOException e) {
+                    usable = false;
+                    break;
+                }
+                if (!dir.endsWith ("HTCACHE")) {
+                    checkVolumesInUseUnix (dir);
+                } else {
+                    checkPathUsage (dir);
+                }
+            } else {
+                try {
+                    base = fileList[i].getCanonicalPath();
+                } catch (IOException e) {
+                    usable = false;
+                    break;
+                }
+                checkPathUsage (base);
+            }
+        }
+    }
+
+
+
+   ///////////////
+   //  Windows  //
+   ///////////////
+   
+   private void checkWindowsCommandVersion () {
+        windowsCommand = null;
+        String os = System.getProperty("os.name").toLowerCase();
+        String[] oses = {"windows 95", "windows 98", "windows me"};
+       
+        for (int i = 0; i < oses.length; i++)
+        {
+            if (os.indexOf(oses[i]) >= 0){
+                windowsCommand = "command.com";
+                break;
+            }
+        }
+        if (windowsCommand == null)
+            windowsCommand = "cmd.exe";
+    }
+   
+    private String dfWindowsGetConsoleOutput (String device) {
+        ArrayList<String> processArgs = new ArrayList<String>();
+        processArgs.add(windowsCommand);
+        processArgs.add("/c");
+        processArgs.add("dir");
+        processArgs.add(device);
+       
+
+        ProcessBuilder processBuilder = new ProcessBuilder(processArgs);
+        Process process;
+        try {
+            process = processBuilder.start();
+        } catch (IOException e) {return null;}
+
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+        String line;
+        String lastLine = null;
+        while (true) {
+            try {
+                line = bufferedReader.readLine ();
+            } catch (IOException e) { return null; }
+            if (line == null)
+              break;
+            if (line.trim().length() > 0)
+                lastLine = line;
+        }
+        return lastLine;
+    }
+   
+    private void getAllVolumesWindows () {
+        for (char c = 'A'; c <= 'Z'; c++) {
+            String dirName = c + ":\\";
+            if (dfWindowsGetConsoleOutput (dirName) != null) {
+                allVolumes.add(String.valueOf(c));
+            }
+        }   
+    }
+
+    private void checkStartVolume() {
+        File file = new File("DATA");
+
+        String path = null;
+        try { path = file.getCanonicalPath().toString(); } catch (IOException e) { return; }
+        if (path.length() < 6)
+          return;
+         
+        int index = -1;
+        try { index = allVolumes.indexOf(path.substring(0, 1)); } catch (IndexOutOfBoundsException e) { return; }
+        if (index > -1)
+            usedVolumes.set(index, true);
+    }
+
+    public void dfWindows () {
+        for (int i = 0; i < allMountPoints.size(); i++){
+            // in yacyUsedMountPoints aendern
+            String line = dfWindowsGetConsoleOutput(yacyUsedVolumes.get(i) + ":\\");
+            String[] tokens = line.trim().split(" ++");
+           
+            long[] vals = new long[2];
+            vals[0] = -1;
+            try { vals[1] = new Long(tokens[2].replaceAll("[.,]", "")); } catch (NumberFormatException e) {continue;}
+            diskUsage.put (yacyUsedVolumes.get(i), vals);
+        }
+    }
+
+   
+   
+   /////////////
+   // common  //
+   /////////////
+
+    private int getOS () {
+        String os = System.getProperty("os.name").toLowerCase();
+        for (int i = 0; i < OSname.length; i++)
+        {
+            if (os.indexOf(OSname[i]) >= 0)
+                return i;
+        }
+        errorMessage = "unknown operating system (" + System.getProperty("os.name") + ")";
+        return -1;
+    }
+
+    private void checkMapedSubDirs () {
+        //  FIXME whats about the secondary path???

+        //   = (getConfig(plasmaSwitchboard.INDEX_SECONDARY_PATH, "");

+        String[] pathes =  {plasmaSwitchboard.HTDOCS_PATH,       
+                            plasmaSwitchboard.INDEX_PRIMARY_PATH,
+                            plasmaSwitchboard.LISTS_PATH,
+                            plasmaSwitchboard.PLASMA_PATH,
+                            plasmaSwitchboard.RANKING_PATH,
+                            plasmaSwitchboard.WORK_PATH};
+
+        for (int i = 0; i < pathes.length; i++) {
+            String path = null;
+            try {
+                path = sb.getConfigPath(pathes[i], "").getCanonicalPath().toString();
+            } catch (IOException e) { continue; }
+            if (path.length() > 0)
+                checkPathUsage (path);
+        }
+    }
+   
+    private void checkPathUsage (String path) {
+        for (int i = 0; i < allMountPoints.size(); i++){
+            if (path.startsWith (allMountPoints.get(i))) {
+                usedVolumes.set(i, true);
+                return;
+            }
+        }
+    }
+}
+
diff -w -B -N -r -u -x yacy.init -x '*yacy.java' -x '*.jar' -x '*DATA*' -x '*RELEASE*' -x '*.class' -x .svn yacy-svn/source/de/anomic/yacy/resourceObserver.java yacy-work/source/de/anomic/yacy/resourceObserver.java
--- yacy-svn/source/de/anomic/yacy/resourceObserver.java   1970-01-01 01:00:00.000000000 +0100
+++ yacy-work/source/de/anomic/yacy/resourceObserver.java   2008-06-03 00:02:04.760159482 +0200
@@ -0,0 +1,152 @@
+// resourceObserver.java
+// -----------------------
+// part of YaCy
+// (C) by Detlef Reichl; detlef!reichl()gmx!org
+// Pforzheim, Germany, 2008
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Using this software in any meaning (reading, learning, copying, compiling,
+// running) means that you agree that the Author(s) is (are) not responsible
+// for cost, loss of data or any harm that may be caused directly or indirectly
+// by usage of this softare or this documentation. The usage of this software
+// is on your own risk. The installation and usage (starting/running) of this
+// software may allow other people or application to access your computer and
+// any attached devices and is highly dependent on the configuration of the
+// software which must be done by the user of the software; the author(s) is
+// (are) also not responsible for proper configuration and usage of the
+// software, even if provoked by documentation provided together with
+// the software.
+//
+// Any changes to this file according to the GPL as documented in the file
+// gpl.txt aside this file in the shipment you received can be done to the
+// lines that follows this copyright notice here, but changes must not be
+// done inside the copyright notive above. A re-distribution must contain
+// the intact and unchanged copyright notice.
+// Contributions and changes to the program code must be marked as such.
+
+package de.anomic.yacy;
+
+import java.lang.String;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+
+import de.anomic.plasma.plasmaSwitchboard;
+import de.anomic.server.logging.serverLog;
+import de.anomic.tools.diskUsage;
+
+public final class resourceObserver extends Thread {
+    // The minimal free space on every used volume, for now set to 100 MB.
+    // TODO make it configurable
+    private final static long MIN_FREE_DISK_SPACE = 104857600L;
+    // Unknown for now
+    private final static long MIN_FREE_MEMORY = 0;
+    // We are called every 30 seconds and the disk usage should be checked every two minutes
+    private final int CHECK_DISK_USAGE_FREQ = 4;
+    // The memory usage should be checked on every run
+    private final int CHECK_MEMORY_USAGE_FREQ = 1;
+   

+    private serverLog log = new serverLog("RESOURCE OBSERVER");
+    private diskUsage du;
+    private plasmaSwitchboard sb;

+
+    private int checkDiskUsageCount;
+    private int checkMemoryUsageCount;
+    private boolean disksOK;
+    private boolean memoryOK;
+   
+    public resourceObserver(plasmaSwitchboard sb) {

+        this.sb = sb;
+        du = new diskUsage(sb);
+       
+        if (!du.getUsable ())
+            this.log.logWarning("Disk usage returned: " + du.getErrorMessage());
+       
+        checkDiskUsageCount = 0;
+        checkMemoryUsageCount = 0;
+        disksOK = true;
+        memoryOK = true;
+    }

+
+    public boolean resourceObserverJob() {
+        checkDiskUsageCount++;
+        checkMemoryUsageCount++;
+
+        boolean tmpDisksOK = true;
+        boolean tmpMemoryOK = true;
+        if (checkDiskUsageCount >= CHECK_DISK_USAGE_FREQ) {
+            checkDiskUsageCount = 0;
+            tmpDisksOK = checkDisks();
+            disksOK = tmpDisksOK;
+        }
+        if (checkMemoryUsageCount >= CHECK_MEMORY_USAGE_FREQ) {
+            checkMemoryUsageCount = 0;
+            tmpMemoryOK = checkMemory();
+            memoryOK = tmpMemoryOK;
+        }
+       
+        if (!tmpDisksOK || !tmpMemoryOK) {
+            if (!sb.crawlJobIsPaused(plasmaSwitchboard.CRAWLJOB_LOCAL_CRAWL)) {
+                this.log.logInfo("disabling local crawls");
+                sb.pauseCrawlJob(plasmaSwitchboard.CRAWLJOB_LOCAL_CRAWL);
+            }
+            if (!sb.crawlJobIsPaused(plasmaSwitchboard.CRAWLJOB_REMOTE_TRIGGERED_CRAWL)) {
+                this.log.logInfo("disabling remote triggered crawls");
+                sb.pauseCrawlJob(plasmaSwitchboard.CRAWLJOB_REMOTE_TRIGGERED_CRAWL);
+            }
+        }
+        return true;
+    }
+   
+    public boolean getDisksOK () {
+        return disksOK;
+    }
+   
+    public boolean getMemoryOK () {
+        return memoryOK;
+    }
+   
+    public long getMinFreeDiskSpace () {
+        return MIN_FREE_DISK_SPACE;
+    }
+   
+    private boolean checkDisks() {
+        boolean below = false;   
+   
+        if (!du.getUsable ())
+            return true;
+       
+        HashMap<String, long[]> usage = du.getDiskUsage();
+        Iterator<Map.Entry<String, long[]>> iter = usage.entrySet().iterator();
+        Map.Entry<String, long[]> entry;
+        while (iter.hasNext()) {
+            entry = iter.next ();
+            String key = entry.getKey();
+            long[] val = entry.getValue();
+            if (val[1] < MIN_FREE_DISK_SPACE) {
+                this.log.logWarning("Volume: " + key + " free space to low");
+                below = true;
+            }
+        }
+        return !below;
+    }
+   
+    private boolean checkMemory() {
+        return true;
+    }
+}

+



Da ich grade gesehen habe, das das Forum den Patch ein wenig zerissen hat lege ich ihn nochmals auf meinen webserver unter

http://det.cable.nu/yacy/ro04874.diff.txt
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 03, 2008 3:35 pm

Habe noch einen kleinen Bug in der Windowsversion gefunden. Patch zu 0.587/04875 gibt es unter http://det.cable.nu/yacy/ro04875.diff.txt
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Orbiter » Di Jun 03, 2008 3:48 pm

datengrab, das sieht alles super aus und wir brauchen das auch unbedingt, aber ... hab momentan keine Zeit, und das 0.59 muss auch noch fertig werden.
Möchtest du das selber ins SVN einchecken? Bitte dazu einen Account auf Berlios machen und mir deine Kennung schicken.

zu deinem Code oben:
ich würde den Überwachungsvorgang lieber im Cleaner-Thread haben, wir haben schon so viele Threads in YaCy und der cleanerJob ist genau die richtige Position für diese Sache.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 03, 2008 4:26 pm

Orbiter hat geschrieben:datengrab, das sieht alles super aus und wir brauchen das auch unbedingt, aber ... hab momentan keine Zeit, und das 0.59 muss auch noch fertig werden.

Ist schon grob abschätzbar, wann du den 0.59 veröffentlichen willst? Dann wurde ich das einchecken danach machen.
Möchtest du das selber ins SVN einchecken? Bitte dazu einen Account auf Berlios machen und mir deine Kennung schicken.

Ja, mach ich. Ich bin dort als det angemeldet
zu deinem Code oben:
ich würde den Überwachungsvorgang lieber im Cleaner-Thread haben, wir haben schon so viele Threads in YaCy und der cleanerJob ist genau die richtige Position für diese Sache.

Ok, baue ich um.

An die Windowsnutzer: könnte mal bitte jemand prüfen ob die Sache unter Windows funktioniert? Ich würde es ungern einchecken ohne das es überhaupt mal in einem realen System geprüft wurde.

Zur Funktion: Wenn eine der beiteiligten Platte zu voll ist (> 100MB freier Platz) wird eine Meldung im Log ausgegeben, das crawling abgeschaltet und auf der Statusseite erscheint eine entsprechende Meldung (Die Meldung erscheint aber erst nach einem Neuaufbau der Seite, da diese ja seit Einbau des Rss-Terminals nicht mehr zyklisch geladen wird).

Zum Test:
1. Mit ausreichend Platz auf der Platte den Peer starten und nach Erreichbarkeit des Webinterfaces mindestens drei Minuten laufen lassen. Es sollte nichts passieren.
2. Test mit zu voller Platte. Hierzu entweder eine temporäre Datei aureichender Größe anlegen, oder in der Datei source/de/anomic/yacy/resourceObserver.java die Zeile 55 ändern. Hier einfach die Zahl am Ende auf einen Wert setzen, der größer ist als der freie Speicherplatz (in Byte) auf der verwendeten Platte. Das "L" am ende des Werts nicht vergessen. Nach dem Kompilieren sollte der Peer dann nach ein paar Minuten das oben beschriebene Verhalten zeigen.

Zum Thema automatischer Seitenneuaufbau der Statusseite: ist da jemand dran?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Lotus » Di Jun 03, 2008 5:36 pm

datengrab hat geschrieben:An die Windowsnutzer: könnte mal bitte jemand prüfen ob die Sache unter Windows funktioniert? Ich würde es ungern einchecken ohne das es überhaupt mal in einem realen System geprüft wurde.

Ich habe mir das noch nicht genau angesehen. Kannst du erst einmal ein if(!serverSystem.isWindows) drum machen wenn du es eincheckst? (import de.anomic.server.serverSystem erforderlich).

Zum Thema automatischer Seitenneuaufbau der Statusseite: ist da jemand dran?

Da kann ich mir nur ahnen was du meinst. Der ist mit dem Terminal weggefallen. Der Banner wird stattdessen über JavaScript aktualisiert. Persönlich finde ich es weniger wichtig, dass ich fehlenden Platz unmittelbar angezeigt bekomme.
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon Huppi » Di Jun 03, 2008 6:18 pm

Persönlich finde ich es weniger wichtig, dass ich fehlenden Platz unmittelbar angezeigt bekomme.


Ja, Hauptsache die Katastrophe wird verhindert :-)

Ich habe noch einen Windows XP Rechner. Wo bekomme ich ein fertiges Paket her, um das am Wochenende zu testen?
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 03, 2008 6:30 pm

Lotus hat geschrieben:
datengrab hat geschrieben:An die Windowsnutzer: könnte mal bitte jemand prüfen ob die Sache unter Windows funktioniert? Ich würde es ungern einchecken ohne das es überhaupt mal in einem realen System geprüft wurde.

Ich habe mir das noch nicht genau angesehen. Kannst du erst einmal ein if(!serverSystem.isWindows) drum machen wenn du es eincheckst? (import de.anomic.server.serverSystem erforderlich).

In die serverSystem Klasse hatte ich bislang noch gar nicht rein geschaut. Von der Funktion überschneidet es sich zum Teil mit meiner Systemerkennung. Ich werde mal schaun, ob man das nicht irgendwie sinnvoll kombinieren kann. An sonsten werde ich es wohl erst mit ausgeklammertem Windows einchecken.
Zum Thema automatischer Seitenneuaufbau der Statusseite: ist da jemand dran?

Da kann ich mir nur ahnen was du meinst. Der ist mit dem Terminal weggefallen. Der Banner wird stattdessen über JavaScript aktualisiert. Persönlich finde ich es weniger wichtig, dass ich fehlenden Platz unmittelbar angezeigt bekomme.

Hier geht es nicht nur um den Plattenplatz:

Zum Plattenplatz: das Crawling wird deaktiviert, was mangels Seitenerneuerung auf der Statusseite nicht mehr sichtbar ist. Ich denke, das man es hier aber sehen sollte. Zum anderen sollte dann narürlich ein Hinweis erscheinen, warum das Crawling deaktiviert wurde. Auf der WatchCrawler Seite wäre ein solcher Hinweis dann auch sinnvoll.

Auch die anderen Infos wie das der Peer Virgin / Junior ist und was man ggfs. dagegen tun kann bleiben auf der Seite bestehen, bis die Seite neu geladen wird. Hier fand ich es schön, das diese Hinweise automatisch verschwinden, sobald die Probleme gelöst sind.

Und das sich der komplette rechte Block mit dem Systemstatus automatisch aktuallisiert hat fand ich auch gut.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 03, 2008 7:47 pm

Huppi hat geschrieben:Ich habe noch einen Windows XP Rechner. Wo bekomme ich ein fertiges Paket her, um das am Wochenende zu testen?

http://det.cable.nu/yacy/yacy-huppi-OK.tar.bz2
der sollte einfach so laufen und auch crawlen

http://det.cable.nu/yacy/yacy-huppi-nichtOK.tar.bz2
der sollte nach zwei bis drei Minuten das crawlen einstellen, außer Du hast eine Platte, die größer als 1TB ist in Verwendung.

Ja, mein upload ist schnarch langsam und deshalb fängst du am besten direkt mit dem download an, damit du die Dateien zum WE hast ;)
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Orbiter » Mi Jun 04, 2008 12:22 am

datengrab, zu deiner Frage bzgl. 0.59: da ist noch ein Bug der ganz wichtig ist: das Umschalten zwischen den Use Cases funktioniert nicht, da irgendwo was schief läuft und dann NPEs durchknallen. Wenn ich wüsste woran das liegt hätte ich das schon gefixt, aber hab die Ursache beim Debuggen noch nicht gefunden. Wer hier helfen will: bitte das Umschalten testen und genau beobachen, und weil das hier OT ist dafür bitte einen neuen Thread aufmachen.

Deinen Code erst in 0.591 einzuchecken halte ich auch für eine gute Idee, damit wir hier schnell weiter kommen können und das Release mal fertig wird. Danach kann lustig experimentiert werden.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Resourcenüberwachung

Beitragvon datengrab » Mi Jun 04, 2008 9:37 am

Orbiter hat geschrieben:Use Cases

normal, intranet, suchportal?
NPEs

null pointer exceptions?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Low012 » Mi Jun 04, 2008 9:39 am

@datengrab: Übersetzung korrekt! ;)
Low012
 
Beiträge: 2214
Registriert: Mi Jun 27, 2007 12:11 pm

Re: Resourcenüberwachung

Beitragvon Orbiter » Do Jun 05, 2008 10:25 pm

alles klar, wir sind in der 0.591-Zone. datengrab, hab dich in berlios eingetragen. feuer frei!
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Resourcenüberwachung

Beitragvon Lotus » Fr Jun 06, 2008 9:21 pm

Orbiter hat geschrieben:feuer frei!

Woran erkannt man an den YaCy-dev Versionen, dass ein neuer Release-Zyklus beginnt?
Code: Alles auswählen
E 2008/06/06 22:07:27 STARTUP FATAL ERROR: Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.RangeCheck(Unknown Source)
        at java.util.ArrayList.set(Unknown Source)
        at de.anomic.tools.diskUsage.checkStartVolume(diskUsage.java:373)
        at de.anomic.tools.diskUsage.<init>(diskUsage.java:144)
        at de.anomic.yacy.resourceObserver.<init>(resourceObserver.java:73)
        at de.anomic.plasma.plasmaSwitchboard.<init>(plasmaSwitchboard.java:1117)
        at yacy.startup(yacy.java:234)
        at yacy.main(yacy.java:1006)
S 2008/06/06 22:07:27 SHUTDOWN goodbye. (this is the last line)

:mrgreen: r4894
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon datengrab » Fr Jun 06, 2008 9:41 pm

Lotus hat geschrieben:Woran erkannt man an den YaCy-dev Versionen, dass ein neuer Release-Zyklus beginnt?
8< schnipp
:mrgreen: r4894

Falsch! Daran erkennt man, das "ein Neuer" Schreibrechte aufs SVN hat :mrgreen:
Fix hoffentlich in 4895
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Lotus » Sa Jun 07, 2008 9:16 am

Das ist Egal. Dass YaCy in einigen Versionen nicht mehr startet war die letzten Zyklen schon so. ;)
Der Fix funktioniert, aber die Speicherwarnung möchte nicht kommen.
Was macht denn der split(" ++")? Bei einem Leerzeichen-Split sollte der token[2] richtigerweise die freien Bytes wiedergeben.
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon datengrab » Sa Jun 07, 2008 11:23 am

Lotus hat geschrieben:Der Fix funktioniert, aber die Speicherwarnung möchte nicht kommen.

Ich nehme jetzt mal an, dass auf deiner Platte weniger als 100 MB frei sind, oder du MIN_FREE_DISK_SPACE entsprechend rauf gesetzt hast, oder?
Was macht denn der split(" ++")?

Matcht auf einfaches oder mehrfaches Auftreten ohen Backtracking
Bei einem Leerzeichen-Split sollte der token[2] richtigerweise die freien Bytes wiedergeben.

Sollte? Hast du dir schon mal anzeigen lassen, was raus kommt? An sonsten werde ich mal ein paar zusätzliche debug-Meldungen einbauen. Danke fürs feedback!

Nachtrag: hattest du mal geschaut, ob etwas ins Log geschrieben wird? Fängt mit "RESOURCE OBSERVER" an.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Lotus » Sa Jun 07, 2008 12:30 pm

datengrab hat geschrieben:Nachtrag: hattest du mal geschaut, ob etwas ins Log geschrieben wird? Fängt mit "RESOURCE OBSERVER" an.

Gute Idee.
W 2008/06/07 10:19:21 RESOURCE OBSERVER Disk usage returned: null
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon datengrab » Sa Jun 07, 2008 1:55 pm

Hab noch nen bug gefunden und ein paar zusätzliche Fehlermeldungen eingebaut. r4896 Im blind Programmieren war ich noch nie der beste :|
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Lotus » Sa Jun 07, 2008 3:24 pm

Code: Alles auswählen
W 2008/06/07 16:05:55 RESOURCE OBSERVER Volume: C free space to low
I 2008/06/07 16:05:55 RESOURCE OBSERVER disabling local crawls
I 2008/06/07 16:05:55 RESOURCE OBSERVER disabling remote triggered crawls

Super! 8-)
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon datengrab » Sa Jun 07, 2008 3:31 pm

Spitze :D Danke Dir!
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » So Jun 08, 2008 1:52 pm

Unter Windows XP Home starten beide Versionen von Dienstag bei mir nicht (Huppi-ok und Huppi-nicht-ok):
E 2008/06/08 14:47:44 STARTUP FATAL ERROR: Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.set(Unknown Source)
at de.anomic.tools.diskUsage.checkStartVolume(diskUsage.java:384)
at de.anomic.tools.diskUsage.<init>(diskUsage.java:155)
at de.anomic.yacy.resourceObserver.<init>(resourceObserver.java:74)
at de.anomic.plasma.plasmaSwitchboard.<init>(plasmaSwitchboard.java:1131
)
at yacy.startup(yacy.java:234)
at yacy.main(yacy.java:1002)
S 2008/06/08 14:47:44 SHUTDOWN goodbye. (this is the last line)
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » So Jun 08, 2008 2:03 pm

Hallo Volker,

jep, da waren noch ein paar Bugs drin. Sollten aber in der aktuellen SVN alle behoben sein.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » So Jun 08, 2008 2:56 pm

SVN4903 auf einer Ubuntu-Kiste:
S 2008/06/08 15:47:47 CRAWLER Starting Crawling Management

I 2008/06/08 15:47:52 YACY BOOTSTRAP: 52 seeds from seed-list URL http://www.yacy.net/seed.txt, AGE=0h

W 2008/06/08 15:47:52 RESOURCE OBSERVER Disk usage returned: The system command df returned with an error


Auf der Kiste ist df Version 5.96 und läuft natürlich problemlos.

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/Ubuntu-root
37482024 21369896 14208104 61% /
varrun 257968 48 257920 1% /var/run
varlock 257968 0 257968 0% /var/lock
procbususb 10240 44 10196 1% /proc/bus/usb
udev 10240 44 10196 1% /dev
devshm 257968 0 257968 0% /dev/shm
/dev/hda1 233335 13105 207782 6% /boot
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » So Jun 08, 2008 3:09 pm

kannst du mir mal die Ausgaben von
df -k -l
und
cat /etc/fstab
geben
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » So Jun 08, 2008 10:34 pm

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/Ubuntu-root
37482024 21370716 14207284 61% /
varrun 257968 48 257920 1% /var/run
varlock 257968 0 257968 0% /var/lock
procbususb 10240 44 10196 1% /proc/bus/usb
udev 10240 44 10196 1% /dev
devshm 257968 0 257968 0% /dev/shm
/dev/hda1 233335 13105 207782 6% /boot


# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/mapper/Ubuntu-root / ext3 defaults,errors=remount-ro 0 1
# /dev/hda1
UUID=7dbb1fe4-d30e-4071-9142-bead111057a2 /boot ext3 defaults 0 2
# /dev/hda5
UUID=ac2fbf07-2684-48c0-aa95-bfd85c0aeb30 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/ /media/floppy0 auto rw,user,noauto 0 0
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » Mo Jun 09, 2008 12:54 am

Da bin ich jetzt wirklich überfragt :( Das einzige was mir an deiner fstab auffiel ist, das mir die Zeile für die Floppy nicht korrekt aussieht. Aber das dürfte ja nichts ausmachen, da df ansonsten ja richtig arbeitet...

Hat vieleicht jemand anderes eine Idee, warum sich ein Befehl auf der Konsole einwandrei ausführen läßt, aber wenn man ihn von Java aus über ProcessBuilder starten will mit Fehler beendet?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » Mo Jun 09, 2008 3:30 pm

In dem Rechner habe ich das Diskettenlaufwerk entfernt.
Ich schaue mir mal die anderen Peers an, jeweils drei sind von der Hardware her identisch, Software sehr ähnlich (Ubuntu-Server, aber in verschiedenen Versionen).
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » Mo Jun 09, 2008 4:05 pm

Ich hatte auch noch einen Bugreport für die 5.97er Version der ubuntu coreutils gefunden, bei denen df in Verbindung mit per UUID gemounteten Laufwerken Probleme machen soll. Die coreutils mal ebend so gegen eine neuere Version auszutauschen ist geht leider auch nicht, da man sich damit evtl. das System ziemlich verhunzen kann... Ich selbst habe hier debian-testing laufen mit der 6.10er Version und da klappt alles einwandfrei.

Da ja schon einige eine yacy-Version mit der Ressourcenüberwachung am laufen haben: Könntet ihr mal schaun, ob sich in den Logs etwas mit "RESOURCE OBSERVER" findet?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon miTreD » Mo Jun 09, 2008 4:39 pm

datengrab hat geschrieben:Könntet ihr mal schaun, ob sich in den Logs etwas mit "RESOURCE OBSERVER" findet?
Auf beiden Peers nix, aber meine Platten haben auch noch Platz.
miTreD
 
Beiträge: 1241
Registriert: Mi Jun 27, 2007 11:35 am
Wohnort: /home

Re: Resourcenüberwachung

Beitragvon DanielR » Mo Jun 09, 2008 7:05 pm

Ebenfalls Ubuntu Hardy (8.04)
Code: Alles auswählen
W 2008/06/08 21:25:09 RESOURCE OBSERVER Disk usage returned: The system command df returned with an error

df --version
df (GNU coreutils) 6.10
Copyright © 2008 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder höher <http://gnu.org/licenses/gpl.html>
Dies ist freie Software: Sie können sie ändern und weitergeben.
Es gibt keinerlei Garantien, soweit wie es das Gesetz erlaubt.

Geschrieben von Torbjorn Granlund, David MacKenzie und Paul Eggert.

Ist übrigens 64 bit
Code: Alles auswählen
df -k -l
Dateisystem           1K‐Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/sda2             38441132   3248252  33240180   9% /
varrun                 2025140       100   2025040   1% /var/run
varlock                2025140         0   2025140   0% /var/lock
udev                   2025140        60   2025080   1% /dev
devshm                 2025140         0   2025140   0% /dev/shm
lrm                    2025140     43040   1982100   3% /lib/modules/2.6.24-17-generic/volatile
/dev/sda5            309573264 202025288 107547976  66% /home

(YaCy läuft unter /home)
DanielR
 
Beiträge: 395
Registriert: Di Feb 12, 2008 2:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » Di Jun 10, 2008 1:14 am

Sodele, ich habe ein paar Peers mal neu gestartet :-)
yacy1 (nur DHT out):
W 2008/06/10 01:55:09 RESOURCE OBSERVER Disk usage returned: The system command df returned with an error


yacy5:
keine Meldung im Log

yacy6:
keine Meldung im Log

HYN:
keine Meldung im Log

alle Peers sind YaCy-only, da läuft nix anderes drauf, Ubuntu-Server.

yacy1: 40B HDD, yacy5, yacy6: 200GB HDD, HYN, 30GB 2.5'' HDD
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon Lotus » Di Jun 10, 2008 8:24 pm

Ich habe mir den Windows-Code noch einmal genauer angesehen.
Wieso werden erst alle Laufwerke in einem Array erfasst, um dann den richtigen Index für das abzufragende Laufwerk zu finden?
Ich würde es anders bauen: Die von YaCy wirklich benutzten Laufwerke in ein Array speichern und dieses dann komplett nach Speicherplatz abfragen.
Die jetzige Lösung ist nicht schick, da ein Laufwerk z.B. auch ein eingehängtes Netzlaufwerk sein kann.
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon Huppi » Di Jun 10, 2008 8:52 pm

Zu den Ubuntu-Peers. Sollte IMMER eine Meldung im Log erscheinen? Oder nur, wenn etwas unerwartetes passiert?
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 10, 2008 9:08 pm

Das ist so gedacht, das erst einmal alle Laufwerke ermittelt werden, die überhaupt vorhanden sind. Danach werden die ermittelt, die von yacy genutzt werden. Dies erfolgt in zwei Schritten: 1. feststellen von welchem Laufwerk yacy gestartet wurde - auf diesem liegt zu mindest der HTCACHE 2. Ermittlung aller über die config gemappten Laufwerke. Dieses Vorgehen stellt sicher, das bei den späteren Läufen, bei denen nur der frei Speicherplatz abgefragt werden soll nur die Laufwerke befragt werden, die auch wirklich von yacy genutzt werden.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Di Jun 10, 2008 9:10 pm

Huppi hat geschrieben:Zu den Ubuntu-Peers. Sollte IMMER eine Meldung im Log erscheinen? Oder nur, wenn etwas unerwartetes passiert?

Zum einen, wenn zu wenig Platz vorhanden ist zum anderen, wenn ein Fehler auftritt. Wenn alles OK ist wird nichts ins log geschrieben. Das werde ich aber wahrscheinlich auch noch ändern, da die Überwachung nur rund alle fünf Minuten aufgerufen wird und man dann zumindests weiß das alles OK ist.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Huppi » Di Jun 10, 2008 10:16 pm

Dann paßt ja bei yacy5 und yacy6 auf jeden Fall. Die 200GB sind bei weitem noch nicht angekratzt ...
Huppi
 
Beiträge: 898
Registriert: Fr Jun 29, 2007 9:49 am
Wohnort: Kürten

Re: Resourcenüberwachung

Beitragvon datengrab » Mi Jun 11, 2008 7:55 pm

Ich habe die ganz Geschichte ein wenig überarbeitet (r4914). Erstmal werden jetzt ein paar mehr Meldung ausgegeben; auch wenn alles glatt läuft. Wenn etwas nicht so glatt läuft sollte es jetzt zu mindest Fehlermeldungen geben, wo es hängt so das man weiß wo man weitersuchen muss. Bitte mal in den Logs nach Meldungen zu "RESOURCE OBSERVER" und "DISK USAGE" suchen. Das der Code momentan ein wenig seltsam aussieht weiß ich und das wird auch behoben, sobald ich den Problemen auf den Grund gegangen bin.

@Orbiter: in diskUsage.java hast Du in checkVolumesInUseUnix einen Kommentar eingefügt
// ATTENTION! THIS LOOP NEEDS A TIME-OUT

das verstehe ich nicht wirklich. Dort werden ausschließlich die Dateien/Verzeichnisse unter DATA durch gegangen. Da dies nur eine Hand voll Verzeichnisse sind und die Auflistung auch nicht rekursiv erfolt, kann dort doch eigentlich nichts hängen bleiben, oder? Falls dem doch so ist: Wie implementiere ich dort einen Timeout? Mir würde dazu nur einfallen die eigentliche Arbeit in einen Thread zu verlagern und über einen zweiten Thread den timeout realisieren, der bei Zeiten den ersten Thread killt.

Nachtrag: von der Änderung ist momentan nur die Unix-Version betroffen. Windows wird wenn alles klappt anschließend umgestellt.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon Orbiter » Mi Jun 11, 2008 10:15 pm

naja bei mir hängt das ewig beim Start-up. So lange, dass ich nach einiger Zeit gemütlich ein Terminal-Fenster aufmachen kann, ein ps ax | grep java eingeben kann, das kill -3 auf den Prozess absetze, das log studiere und der immer noch nicht fertig ist. Habs eben gestoppt, 50 Sekunden. Das macht ja eine superfette turn-around Zeit beim Entwickeln und blockiert die Arbeit. Ein User weiss damit nix anzufangen, ich kann mir auch nicht vorstellen das das so laufen soll. Hier der Thread Dump:
Code: Alles auswählen
"main" prio=5 tid=0x01001370 nid=0xb0801000 runnable [0xb07ff000..0xb0800148]
   at java.io.UnixFileSystem.list(Native Method)
   at java.io.File.list(File.java:937)
   at java.io.File.listFiles(File.java:1015)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:274)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.checkVolumesInUseUnix(diskUsage.java:288)
   at de.anomic.tools.diskUsage.<init>(diskUsage.java:129)
   at de.anomic.yacy.resourceObserver.<init>(resourceObserver.java:74)
   at de.anomic.plasma.plasmaSwitchboard.<init>(plasmaSwitchboard.java:1117)
   at yacy.startup(yacy.java:234)
   at yacy.main(yacy.java:1006)
(SVN 4910)

Von daher habe ich mir die Stelle einfach mal markiert, und wollte dich darauf noch ansprechen. Muss das wirklich so sein? Ich dachte die Lösung sieht vor das bei jedem OS nur eine df-Abfrage gemacht wird, was ja sehr schnell gehen sollte.

Hier gibts noch ein anders Problem: der cleaner-Prozess des HTCACHE macht beim Start-Up eine gleiche Bestandsaufnahme, aber nur für den HTCACHE-Bereich. Auch der läuft sehr lange, wird aber in einem eigenen Thread gestartet. Dieser und dein Thread machen also in etwa das gleiche und kommen sich wahrscheinlich auch noch in die Quere. Ich hatte gehofft das deine Routinen einen du auf OS-Ebene anbietet, so dass ich mir das durchzählen der Einzelfiles sparen kann.
Orbiter
 
Beiträge: 5796
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Resourcenüberwachung

Beitragvon datengrab » Mi Jun 11, 2008 11:01 pm

Das das ein _wenig_ dauern kann, kann ich mir schon denken. Beim Start wird einmalig das komplette DATA-Verzeichniss - _ausschließlich_ dem HTCACHE - rekursiv gescannt; meiner vorige Aussage war was das angeht falsch, da hatte ich was anderes im Hinterkopf; Sorry. Der Grund dahinter ist, das man auf Unix-Systemen ja jede einzelne Datei oder jedes Verzeichniss per "ln" auf ein anderes Laufwerk binden kann (was ich auch schon einige Zeit hatte um die Last der einzelnen Platte zu vermindern oder alternativ yacy schneller zu machen).

Ich habe grade mal ein
du -h --exclude=HTCACHE/*

in meinem DATA-Verzeichniss gemacht. Das braucht rund eine Sekunde. "Rund", weil ich dabei einfach nur auf die Uhr geschaut habe. Wenn ich mich nicht verzählt habe sind es 69 Dateien oder Verzeichnisse. Ich kann mir nicht vorstellen, was da 50 Sekunden dauern soll. In dem Lauf in diskUsage.java wird nicht der verbrauchte Speicherplatz je Datei ermittelt, sonder auf welchem Laufwerk sie liegt, aber das ist eine sehr kurze Routine die nicht solche eine Verzögerung erklären würde. Daneben, das irgend etwas ganz seltsammes in deinem Dateisystem vorgeht ;) kann es eigentlich nur ein Bug in meiner Implementierung sein. Ich werden mal eine Zeitnahme einfügen. Mal schaun wie lang es bei mir dauert.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Mi Jun 11, 2008 11:23 pm

Ich habe jetzt mal den Aufruf von checkVolumesInUseUnix eingefasst
Code: Alles auswählen
    long millis = System.currentTimeMillis();
                checkVolumesInUseUnix ("DATA");
    log.logInfo("timeusage " + (System.currentTimeMillis() - millis));

Im Log kam folgenden dabei raus:
I 2008/06/12 00:18:58 DISK USAGE timeusage 261
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon DanielR » Do Jun 12, 2008 8:48 am

@Ubuntu:
Code: Alles auswählen
DISK USAGE logpoint 0 Cannot run program "df": java.io.IOException: error=12, Cannot allocate memory
DISK USAGE time for checkVolumes 44613
RESOURCE OBSERVER Disk usage returned: df:
Cannot run program "df": java.io.Exception: error=12, Cannot allocate memory

Das Problem ist wohl, dass vorher der Index, die collections und urls geladen werden (bei mir über 30 Mio. RWIs, 15 Mio. URLs)
DanielR
 
Beiträge: 395
Registriert: Di Feb 12, 2008 2:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Do Jun 12, 2008 11:00 am

Das einzige was ich mir noch vorstellen könnte, warum es so lange dauern kann ist, das sich die Methode aus irgendwelchen Gründen doch in den HTCACHE verrennt. Wenn es unterschiedliche Implementierungen von getCanonicalPath gibt (die Doku schweigt sich dazu aus), die z.B. bei Verzeichnissen am Ende ein "/" anhängt würde die Prüfung
Code: Alles auswählen
if (!dir.endsWith ("HTCACHE")) {

natürlich nicht mehr greifen. Eine Prüfung bei mir zeigte, das grundsätzlich kein slash angehängt wird.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon datengrab » Do Jun 12, 2008 12:33 pm

Ich glaube ich habe das Problem gefunden. Zum einen wurden auch LOCALE und RELEASE gescannt. In beiden können sich so einige Dateien befinden, die aber wohl kaum jemand über mehrere Laufwerke splitten wird. Einen fix hierfür habe ich in r4917 eingebaut.

Ein weiterer dicker Brocken der noch bleibt ist der Scan der commons. Hier sammeln sich mit der Zeit 256 Verzeichnisse an, in denen - ja wieviel eigentlich??? - Dateien angelegt werden. Ich denke hierfür sollte ich auch noch eine Sonderprüfung einbauen. Bis lang habe ich bei mir auf meinen Peers nur ein Verzeichniss collection.0028.commons. Ist das das einzige commons Verzeichniss, oder werden das auch irgendwann einmal mehr?
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Re: Resourcenüberwachung

Beitragvon DanielR » Do Jun 12, 2008 3:17 pm

Werden alle Dateien gescannt? Ich würde sagen Verzeichnisse reichen! Wenn einer einzelne Dateien auf andere Laufwerke symlinkt ist er selbser schuld :p
DanielR
 
Beiträge: 395
Registriert: Di Feb 12, 2008 2:22 pm

Re: Resourcenüberwachung

Beitragvon Lotus » Do Jun 12, 2008 3:20 pm

Es gibt nur ein commons. Soweit ich das verstanden habe würde es keinen Sinn machen die commons wegen IO auszulagern, da dort nur schreibend ausgelagert wird.

Was für mich auch noch immer keinen Sinn macht ist, unter Windows beim Start alle möglichen Laufwerke abzufragen (wir brauchen nur die auf denen YaCy ist).
Lotus
 
Beiträge: 1699
Registriert: Mi Jun 27, 2007 3:33 pm
Wohnort: Hamburg

Re: Resourcenüberwachung

Beitragvon datengrab » Do Jun 12, 2008 3:30 pm

DanielR hat geschrieben:Werden alle Dateien gescannt?

Ja, bis auf die genannten, die ausgenommen sind.
Ich würde sagen Verzeichnisse reichen! Wenn einer einzelne Dateien auf andere Laufwerke symlinkt ist er selbser schuld :p

Nach meinen Messungen verteilt sich der IO nahezu komplett auf HTCACHE und RICOLLECTION. Deswegen hatte ich einen Zeit den HTCACHE auf einer Platte und RICOLLECTION auf zwei Platten verteilt.

Ich werde noch wie oben geschrieben die commons ausklammern und dann dürfte sich die scanzeit in Grenzen halten.
datengrab
 
Beiträge: 366
Registriert: Sa Aug 25, 2007 7:22 pm

Nächste

Zurück zu Mitmachen

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast