CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
Apache HTTP-Server Alles was Ihr über den Apache diskutieren möchtet, gehört hierein |
10.12.2008, 17:48:12
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
Apachee Rechenleistung auf 100 % bringen
Hallo,
momentan plagt mich ein kleines Problem, ich habe ein rechen fressenden php Script erstellt und mein CPU duckert bei durchschnittlich 30 % rum.
Mein Script soll Landflächen Generieren in einer bestimmten Feldmenge. Ist der Prozess erfolgreich schreibt er es in eine MySQL DB.
Das kleinste ist ~30.000 Felder und das Größte ~4,5 Mio. Felder bzw. Einträge in der DB. Ich habe jetzt mit den kleinsten angefangen und nach ca. 30 min habe ich ca. 5.500 Einträge (Felder) um so mehr Einträge um so länger dauert es, eh wieder ein neuer hinzu kommt. Also wäre es Cool wenn der CPU voll genutzt werden würde. Die Frage ist wie mach ich das?
Ich habe ein Phenom 9950 X4 2,6 GHz momentan sieht es so aus als würde er nur ein Kern verwenden. Als System habe ich Vista Ultimate 64 drauf und nutze das XAMPP Paket.
Ich habe in übrigen eine ATI 4870 X2 Grafikkarte DX10 Fähig wäre lustig wenn man die Berrechnungen auch der Grafikkarte mit anhängen könnte *grins*
|
10.12.2008, 18:00:36
|
SELFPHP Profi
|
|
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
|
|
AW: Apachee Rechenleistung auf 100 % bringen
php ist nicht für mehrkern- / multi- CPUs optimiert. von daher... no way. das müsste dir allerdings als nutzer einer 4-kern-cpu bekannt vorkommen, oder .-
cx
|
10.12.2008, 18:11:18
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Apachee Rechenleistung auf 100 % bringen
danke für die schnelle Antwort. Naja nur bedingt, ich habe das System noch nicht all-zu lange und habe erst seit ein paar Tagen xampp etc. Dort Installiert. vorher habe ich ein einkerner gehabt bzw. habe ich immer noch (Ubuntu).
Konnte ja sein das es bereits Möglichkeiten gibt von den ich nichts weiss.
|
10.12.2008, 18:22:12
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
|
|
AW: Apachee Rechenleistung auf 100 % bringen
Das Script in ein gutes dutzend Teile splitten und alle auf der Kommandozeile gleichzeitig starten. Das sollte die Auslastung hoch treiben. Bzw die Last auf alle Kerne verteilen.
|
10.12.2008, 18:30:37
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Apachee Rechenleistung auf 100 % bringen
das ist eine gute idee, ich habe das Script so entworfen das wenn die Zeitbegrensung eintritt ich quasi von der gleichen Stelle wieder anfangen kann.
jetzt habe ich nur noch eine kleine frage dazu. Wenn ich jetzt den Script meinetwegen 4 mal öffne und alles parallel berechnen lasse kann es vorkommen das ich Doppeleinträge habe?
z. B.
CPU Kern 1
0 0
0 1
1 1
-1 0
CPU Kern 2
-1 -1
1 0
0 0
1 -1
die sollen Quasi in der DB vergleichen ob bereits in der Variation schon existirt und wenn nicht eintragen... könnte es passieren das der eine (Kern 1) grad fertig ist mit Kontrollieren und der andere Kern (2) die 0 0 einträgt und der wiederum (Kern 1) grad die 0 0 Notiert?
Kann das dann vorkommen? oder Läuft trotz allem alles nach und nach ab?
|
10.12.2008, 18:33:46
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
|
|
AW: Apachee Rechenleistung auf 100 % bringen
Ja!
RaceConditions können durchaus auftreten.
Das kannst du mit Transaktionen oder Tablelocks unterbinden.
In 4 Teile hacken reicht übrigens nicht unbedingt.
|
10.12.2008, 18:35:49
|
Junior Member
|
|
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
|
|
AW: Apachee Rechenleistung auf 100 % bringen
Warum denkst du, dass es primär an PHP liegt?
So viele Einträge brauchen normalerweise ihre Zeit bis sie in die DB geschrieben wurden. Wie sieht denn der PHP Code aus der die Query generiert? Die Query selbst zu sehen (wenn nötig abgekürzt) wäre auch interessant - Ich glaube, das ganze liese sich noch etwas optimieren.
Geändert von Crisps (10.12.2008 um 18:36:33 Uhr)
|
10.12.2008, 18:37:48
|
SELFPHP Guru
|
|
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
|
|
AW: Apachee Rechenleistung auf 100 % bringen
wenn du mehrere kerne hast und jeden kern voll auslasten willst, brauchst du ein script, was
a) auch wirklich rechenleistung benötigt. wenn du z.b. nur daten auf die platte schreibst (oder in eine datenbank), wird das kaum die cpu, sondern vielmehr die platte belasten.
b) mehrere prozesse/threads. darauf ist php nicht mal nicht optimiert, sondern einfach nicht gemacht. such dir eine sprache, die für sowas gemacht ist (z.B. mein aktueller favorit für sowas: erlang)
willst du allerdings eigentlich, dass dein script schneller läuft, poste es hier und wir können dir sagen, wie es schneller werden kann.
|
10.12.2008, 18:50:27
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Apachee Rechenleistung auf 100 % bringen
ok, hier wies in etwa aussehen soll genneriert in ein array mit 500 Feldern der rote ist die mitte also 0|0 (xy)
Terraformer
und hier der Code
PHP-Code:
<?php
##############################################################
## Teraformer
##############################################################
## Gesammt Flaeche: 7.200 x 7.200 = 51.840.000 Felder
## a°b°: 360 : 7.200 = 0,05 (0,05 x 0,05) je Feld
## NS WO: 7.200 : 2 = 3.600 (3.600 (180°) x 3.600 (180°))
###########################################################
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Einstellungen
// Standard Einstellungen
$Felder = 7200 * 7200; // Maximale Anzahl der Felder
//$Felder = 20 * 20; // TEST TEST TEST
// die kommenden drei Angaben muss zusammen 100 ergeben.
$Land_Konti = 28; // Fuer Konti in Prozent
$Land_Inseln = 2; // Fuer Inseln in Prozent
$Wasser = 70; // Fuer Wasser in Prozent
// Anzahl der Kontinente und Groesse in Prozent, muss insgesammt 100 Prozent ergeben.
$Kontinente = array(0 => 30,
1 => 20,
2 => 10,
3 => 8,
4 => 12,
5 => 5,
6 => 15);
// Anzahl der Inseln und Groesse in Prozent, muss insgesammt 100 Prozent ergeben.
$Inseln = array(0 => 3,
1 => 3,
2 => 4,
3 => 5,
4 => 5,
5 => 6,
6 => 6,
7 => 7,
8 => 7,
9 => 8,
10 => 8,
11 => 9,
12 => 9,
13 => 10,
14 => 10);
// Einstellungen importieren
// require("../Konfiguration.php");
$DBK_Host = "127.0.0.1";
$DBK_Benutzer = "##########";
$DBK_Passwort = "##########";
$DBK_Datenbank = "##########";
// DB verbinden
mysql_connect($DBK_Host, $DBK_Benutzer, $DBK_Passwort) or die(mysql_error());
mysql_select_db($DBK_Datenbank) or die(mysql_error());
// Einstellungen
/////////////////
/////////////////////
// Funktionen
function Zufalls_Zahl($Start, $Stop)
{
srand((double)microtime() * 1000000);
return rand ($Start, $Stop);
};
function Terraformer($Land)
{
$sql = "INSERT INTO
terraformer
(x, y)
VALUES ('0','0')";
$query = mysql_query($sql) or die (mysql_error());
while($Terra_Insgesammt != $Land)
{
$weiter = True;
while(isset($weiter))
{
$sql = "SELECT
COUNT(*) AS Eintraege
FROM
terraformer
LIMIT 1";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{$Terra_Pos = Zufalls_Zahl(1, $DB[Eintraege]);};
$sql = "SELECT
ID, x, y
FROM
terraformer
WHERE
ID = '$Terra_Pos'
LIMIT 1";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{$x_Wert = $DB[x]; $y_Wert = $DB[y];};
unset($weiter);
if(Zufalls_Zahl(1, 2) == 1)
{
$Terra_x_neu = intval($x_Wert+(Zufalls_Zahl(-1, 1)));
$Terra_y_neu = intval($y_Wert);
$sql = "SELECT
x, y
FROM
terraformer";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{
if($Terra_x_neu == $DB[x] and $Terra_y_neu == $DB[y])
{$weiter = True;};
};
}
else
{
$Terra_x_neu = intval($x_Wert);
$Terra_y_neu = intval($y_Wert+(Zufalls_Zahl(-1, 1)));
$sql = "SELECT
x, y
FROM
terraformer";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{
if($Terra_x_neu == $DB[x] and $Terra_y_neu == $DB[y])
{$weiter = True;};
};
};
};
// NEU: neues Feld hinzufuegen bzw. Koordinaten.
$sql = "INSERT INTO
terraformer
(x, y)
VALUES ('$Terra_x_neu','$Terra_y_neu')";
$query = mysql_query($sql) or die (mysql_error());
$sql = "SELECT
COUNT(*) AS Eintraege
FROM
terraformer
LIMIT 1";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{$Terra_Insgesammt = $DB[Eintraege];};
};
};
// Funktionen
/////////////////////
///////////////////////////////////////////////////////////////////////
// Vorverarbeitung bzw. POST, GET eingeleitette Schritte
if(isset($_POST[Terraformer]))
{Terraformer($_POST[Terraformer]);};
if(isset($_POST[Loeschen]))
{
$sql = "DELETE FROM terraformer;";
$query = mysql_query($sql) or die (mysql_error());
};
// Vorverarbeitung bzw. POST, GET eingeleitette Schritte
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Variablensammlung
// DB Eintraege gesammt
$sql = "SELECT
COUNT(*) AS Eintraege
FROM
terraformer
LIMIT 1";
$query = mysql_query($sql) or die (mysql_error());
while($DB = mysql_fetch_array($query))
{$Terra_Insgesammt = $DB[Eintraege];};
// Optionen fuer Select
unset($n);
$Kontinente_Select = "<optgroup label=\"Kintinente\">";
foreach($Kontinente as $Kontinente_value)
{
$n++;
unset($Felder_Option);
$Felder_Option = ($Felder/100*$Land_Konti)/100*$Kontinente_value;
$Kontinente_Select .= "<option value=\"$Felder_Option\">$n.) $Kontinente_value % (".number_format($Felder_Option, 0, ',', '.' )." Felder)</option>";
};
$Kontinente_Select .= "</optgroup>";
unset($n);
$Inseln_Select = "<optgroup label=\"Inseln\">";
foreach($Inseln as $Inseln_value)
{
$n++;
unset($Felder_Option);
$Felder_Option = ($Felder/100*$Land_Inseln)/100*$Inseln_value;
$Inseln_Select .= "<option value=\"$Felder_Option\">$n.) $Inseln_value % (".number_format($Felder_Option, 0, ',', '.' )." Felder)</option>";
};
$Inseln_Select .= "</optgroup>";
// Variablensammlung
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Ausgabe
echo "<h1>Terraformer</h1>";
echo "<form method=\"POST\">
<select name=\"Terraformer\" size=\"1\">
$Inseln_Select
$Kontinente_Select
</select>
<input type=\"submit\" value=\"Senden\">
</form>";
echo "<BR>";
echo "<form method=\"POST\">
Einträge in DB: $Terra_Insgesammt<BR>
<input type=\"submit\" name=\"Loeschen\" value=\"Löschen\">
</form>";
// Ausgabe
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>
|
10.12.2008, 18:55:35
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Apachee Rechenleistung auf 100 % bringen
achja für die DB:
CREATE TABLE Terraformer (
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
x INT NULL,
y INT NULL,
PRIMARY KEY(ID)
);
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:42:01 Uhr.
|