/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
optimal kode ?
Fra : Simon [2700]


Dato : 07-07-04 21:36

Hej,

er der nogen af jer der kan finde på nogen måde nedenstående kode kan gøres
mere venlig for serveren ? og bør jeg fjerne exit(0) kaldet i slutningen
(skulle det have været exit(1) der signalerer fejlfri afslutning, og hvad
bruges det til ?)
Koden er til en counter og bliver kaldt som

counter.pl?id=counternavn
- fra et <img src> tag

hvorefter den skal tælle feltet "hits" én op i tabellen (mysql db).
Det er vigtigt scriptet kører så hurtigt som muligt så det belaster serveren
mindst muligt, og jeg ved godt
scriptet ikke tager lang tid at eksekvere, men er der nogen faldgrupper jeg
er hoppet i mv. ?

Håber nogen kan komme med et par kloge ord, scriptet kører desuden på en
Redhat maskine hvis det skulle have noget at sige, det ser ud til at virke,
men jeg vil ikke bruge counteren på nogle sider endnu før jeg ved om den
måske kommer til at lægge min server ned fordi jeg har lavet en fejl.

Jeg regner med at scriptet skal håndtere omkring 1-2 millioner hits dagligt
på min server uden det skal kunne mærkes betydeligt (burde vel ikke være et
problem ?). Er der nogen RAM problemer man skal tænke over ?

1000 tak for hjælpen - og på forhånd tak !
mvh.Simon


#!/usr/bin/perl
print "Content-type:text/html\n\n";

use CGI;
$query = new CGI();
$table = $query->param('id');

use DBI;
$|= 1;
$dbh = DBI->connect("DBI:mysql:db:localhost","user","pass");
$dbh->do("update $table SET hits=hits+1;");
exit(0);




 
 
Peter Makholm (07-07-2004)
Kommentar
Fra : Peter Makholm


Dato : 07-07-04 21:50

"Simon [2700]" <devnull@linux.org> writes:

> er der nogen af jer der kan finde på nogen måde nedenstående kode kan gøres
> mere venlig for serveren ?

Du kan sørge for at den ikke skal forbinde sig til databaseserveren
ved alle requests.

Det kan enten gøres ved at gemme din tæller i en flad tekstfil istedet
for en database eller også skal du lave noget andet end et
traditionelt CGI-script som ikke kan lave persistente
databaseforbindelser. (FastCGI eller noget mod_perl snask)

> og bør jeg fjerne exit(0) kaldet i slutningen (skulle det have været
> exit(1) der signalerer fejlfri afslutning, og hvad bruges det til ?)

exit(1) signalerer *ikke* en fejlfri afslutning, snarre tværtimod. Et
script der bare ender vil implicit lave en exit(0).

> Det er vigtigt scriptet kører så hurtigt som muligt så det belaster serveren
> mindst muligt, og jeg ved godt

Og du har lavet ekstensive benchmarks der viser at det er værd at
bruge tid på at optimerer lige netop dette script?

--
Peter Makholm | Sit back and watch the messages. This is actually
peter@makholm.net | more important than one might think as there is a
http://hacking.dk | bug in GNU Mach whereby hitting a key during the
| boot process causes the kernel to panic
| -- GNU Hurd Installation Guide

Soren (News) (08-07-2004)
Kommentar
Fra : Soren (News)


Dato : 08-07-04 09:24

"Simon [2700]" <devnull@linux.org> writes:

[snip]
> #!/usr/bin/perl
> print "Content-type:text/html\n\n";
>
> use CGI;
> $query = new CGI();
> $table = $query->param('id');
>
> use DBI;
> $|= 1;
> $dbh = DBI->connect("DBI:mysql:db:localhost","user","pass");
> $dbh->do("update $table SET hits=hits+1;");
> exit(0);

Hej,

Bare nogle generelle tips:

* Som Peter siger: Er det netop det script du vil optimere? Du siger du
regner med 1-2mill hits/dag paa den, er den counter det eneste din server
laver med den frekvens? (1-2mill = 12-24 hits/sekund).

* Brug mod_perl eller lign. saa dit script ikke skal genindlaeses
fra 'scratch' hele tiden. At kompilere script-sprog for hvert kald
tager tid (mere end selve eksekveringen sandsynligvis) og meget hukommelse.

* Hvis det viser sig at det netop er det script du vil optimere, saa se
paa at lade vaere med at importere pakker:
+ CGI, bruger du kun til at finde en parameter. Hvis du aldrig faar andet
end den ene parameter kan du goere ala:
my $table = substring($ENV{QUERY_STRING}, length("?id"));
(og du kan sikkert selv her se at du kan optimere length(), bare for at
demonstrere princippet - og, at det er noget af et sikkerhedshul direkte
at angive sql-stumper i html'en .
+ DBI, brug en tekst-fil istedet som Peter skriver.

Og saa lige til sidst: Hvorfor har du et image der returnerer html? Og
du skal nok have noget javascript'random med i stien for at snyde browseren
til at kalde dit script for hver pageload.


Mvh,

--
___
Soren Davidsen / o\
Deliver yesterday, code today, think tomorrow. (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Peter Makholm (09-07-2004)
Kommentar
Fra : Peter Makholm


Dato : 09-07-04 13:46

"Simon [2700]" <devnull@linux.org> writes:

> Jeg regner med at scriptet skal håndtere omkring 1-2 millioner hits dagligt
> på min server uden det skal kunne mærkes betydeligt (burde vel ikke være et
> problem ?). Er der nogen RAM problemer man skal tænke over ?

I maj havde du kun 400K hits i døgnet og fik også at vide at du skulle
gemme din tæller i en flad tekstfil og at du nok burde sende et billed
tilbage når du bruger et image-tag.

Læser folk aldrig de svar de får?

http://groups.google.com/groups?threadm=409a5213%240%24318%24edfadb0f%40dread16.news.tele.dk

--
Peter Makholm | Yes, you can fight it, but in the end the ultimate
peter@makholm.net | goal of life is to have fun
http://hacking.dk | -- Linus Torvalds

Simon [2700] (09-07-2004)
Kommentar
Fra : Simon [2700]


Dato : 09-07-04 14:04


> Læser folk aldrig de svar de får?

jo, og tak for dem allesammen, men mit sidste script lagde serveren ned bare
ved 10K hits i timen... så jeg ville gerne lige tjekke efter igen, for jeg
droppede projektet dengang.

det ender nok med jeg prøver en fil løsning denne gang, men har lige et
spørgsmål jeg ikke synes jeg kunne finde svar på på google.

Hvis jeg åbner en fil, og bruger en lock (2), kan jeg så bare læse og skrive
til den (læs: hvordan)? for jeg skal jo først læse hvad der står i den, og
derefter skrive den værdi+1.

open(fh, "$fil") ||die("blah");
$var = <fh>;
close(fh);

så skal jeg vel åbne den til overskrivning bagefter, og i mellemtiden kunne
der jo teoretisk set komme en anden process og læs den, og den ville jo så
skrive en forkert værdi ? - hvilket var grunden til jeg i første omgang
ville bruge mysql..


mvh.Simon








Christian Laursen (09-07-2004)
Kommentar
Fra : Christian Laursen


Dato : 09-07-04 14:21

"Simon [2700]" <devnull@linux.org> writes:

> Hvis jeg åbner en fil, og bruger en lock (2), kan jeg så bare læse og skrive
> til den (læs: hvordan)? for jeg skal jo først læse hvad der står i den, og
> derefter skrive den værdi+1.
>
> open(fh, "$fil") ||die("blah");
> $var = <fh>;
> close(fh);

perldoc -f flock
perldoc -f open
perldoc -f seek

use Fcntl ':flock'; # import LOCK_* constants

open(fh, "+<$fil") ||die("blah");
flock(fh,LOCK_EX);
$var = <fh>;
seek(fh, 0, 0);
print fh ++$var, "\n";
close(fh);

--
Christian Laursen

Peter Makholm (09-07-2004)
Kommentar
Fra : Peter Makholm


Dato : 09-07-04 16:48

"Simon [2700]" <devnull@linux.org> writes:

> Hvis jeg åbner en fil, og bruger en lock (2), kan jeg så bare læse og skrive
> til den (læs: hvordan)? for jeg skal jo først læse hvad der står i den, og
> derefter skrive den værdi+1.

Både Adam og jeg lave rent faktisk kode der virkede tilbage i maj.

--
Peter Makholm | Have you ever felt trapped inside a Klein bottle?
peter@makholm.net |
http://hacking.dk |

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste