[PHP/C] mass mail

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
Er is een site die rond de 72.000 geregistreerde gebruikers heeft, het standaard mail-systeem in de admin werkt dan niet meer goed, daarom heb ik een programma gemaakt in C die aangeroept kan worden door php en de mailing op zich zal nemen.

Nu dacht ik dat ik dat best aardig had aangepakt, het programma werkt al volgt:

-1- Lees X adressen in uit de database, stop deze in een stack, deze thread zal de stack blijven aanvullen

-2- Start Y threads die uit bovenstaande stack een adres pop() 'n en een gepersonaliseerde mail versturen, deze threads zullen dit blijven herhalen

X en Y zijn variabelen die ik zelf in kan stellen.. moet ik nog mee testen staan nu alle twee op 15.

Mail wordt verstuurd via het sendmail commando, de queue loopt enorm op, maar alles lijkt goed te gaan als ik 1000 mails local verstuur, of naar m'n mailservertje thuis op een adsl-lijn. de snelheid is niet om over naar huis te schrijven 82 sec. voor 1000 mails local. En naar mijn ADSL bak 286 sec.

Nu heb ik enkele vragen:
- Is mijn globale aanpak goed van het programma?
- Hoe kan ik beter testen, want normaal zijn het allemaal verschillende mail adressen die niet local of achter een adsl lijn hangen?
- Zijn er nog sendmail of systeem specifieke instellingen die dit proces kunnen versnellen?

Kent iemand een soortgelijk systeem, waar ik het een en ander bij af kan kijken...
zoeken levert meestal alleen spam gerelateerde zaken.


ontwikkel-machine is een magere P3/800 achter een sdsl lijntje op redhat 9.0

Acties:
  • 0 Henk 'm!

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Wordt er voor elk mailtje een nieuwe SMTP sessie opgezet? Dat is overhead die te voorkomen is. Multi-threading is leuk, maar het moet wel een doel hebben. Kun je verschil zien in snelheid als Y 1 is of meer?

Iets wat natuurlijk meer tijd gaat kosten als de adressen verschillend zijn is natuurlijk de MX lookup die gedaan moet worden. Dat is hopelijk iets wat sendmail goed voor je regelt. Ik heb geen ervaring met sendmail, maar daar is vast wel ergens aan te fiedelen.

Zelf heb ik zoiets eens in elkaar gezet in Java (James als mail server, Velocity om de mails te maken). We praten dan over gepersonaliseerde HTML emails van zo'n 40KB per stuk en die gaan er in een tempo van 3 per seoncde doorheen op een machine die vergelijkbaar is met jouw ontwikkel-bak.

With the light in our eyes, it's hard to see.


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
3 per seconde is erg langzaam... 6.6 uur voordat de mailing eruit is, daarmee wordt geen genoegen genomen.

Y=1 ipv 15 zorgt ervoor dat het local 145.338 sec. duurt. Meerdere threads werkt dus wel degelijk. wel was de load van de server en het cpu gebruik een stuk lager dan bij 15.

Mij lijkt dat verschillende adressen juist sneller moet gaan... mede omdat de mijn adsl servertje helemaal over de mik gaat om 1000 mails te ontvangen. jammer dat ik dit niet kan testen.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Gebruik je een lokaal draaiende SMTP-server? Zo ja, doet die z'n DNS-MX-lookups via TCP-DNS of UDP-DNS (het 2e is namelijk dodelijk in dit geval).

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
curry684 schreef op 12 september 2003 @ 12:47:
Gebruik je een lokaal draaiende SMTP-server? Zo ja, doet die z'n DNS-MX-lookups via TCP-DNS of UDP-DNS (het 2e is namelijk dodelijk in dit geval).
ja, ik gebruik een local-smtp ... hoe kan ik er achter komen hoe de dns-lookup wordt gedaan?

sendmail is de mailserver

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Zal iets in de config zijn. DNS via UDP houdt hier overigens in dat er voor iedere recipient minstens 1 aparte query gedaan moet worden, terwijl je ook via 1 TCP-sessie alle 1000 in 'bulk' op kunt vragen.

Hoe groot is het mailtje overigens dat je verstuurt?

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

TormentoR schreef op 12 September 2003 @ 12:36:
3 per seconde is erg langzaam... 6.6 uur voordat de mailing eruit is, daarmee wordt geen genoegen genomen.

Y=1 ipv 15 zorgt ervoor dat het local 145.338 sec. duurt. Meerdere threads werkt dus wel degelijk. wel was de load van de server en het cpu gebruik een stuk lager dan bij 15.

Mij lijkt dat verschillende adressen juist sneller moet gaan... mede omdat de mijn adsl servertje helemaal over de mik gaat om 1000 mails te ontvangen. jammer dat ik dit niet kan testen.
Mja, die mailtjes zijn ook nogal groot. Verder maakte performance niet zo vreselijk veel uit omdat het meer om een gemakkelijk aanpasbare configuratie ging dan om een race monster. Bovendien wilden we kunnen bijhouden wat de status van een individueel mailtje is dus er zit ook nog wat database-overhead bij in.

Verschillende adressen kan sneller gaan als de bottleneck inderdaad in die ADSL verbinding zit. MX lookups zullen extra tijd kosten en je bent natuurlijk ook nog eens afhankelijk van de snelheid van de ontvangende MTA aan de andere kant van de lijn. Over Hotmail heb ik wat dat betreft wel eens vervelende verhalen gehoord omdat het nogal lang kan duren voordat daar mail wordt aangenomen.

With the light in our eyes, it's hard to see.


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
curry684 schreef op 12 September 2003 @ 12:58:
[knip]

Hoe groot is het mailtje overigens dat je verstuurt?
822 byte


staat stechts, "TEST" in :P

ik zal een een flinke MIME mail pakken, daar zal die uiteindelijk voor gebruikt worden.

Acties:
  • 0 Henk 'm!

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

BTW, ik ben wel nieuwsgierig naar hoe jij die mailtjes personaliseert. Als je merge-threads alleen het email adres krijgen, hoe vinden ze dan de informatie die in dat mailtje moet komen te staan?

With the light in our eyes, it's hard to see.


Acties:
  • 0 Henk 'm!

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:30

Akerboom

Codito, ergo sum

Topicstarter
Bobco schreef op 12 September 2003 @ 13:58:
BTW, ik ben wel nieuwsgierig naar hoe jij die mailtjes personaliseert. Als je merge-threads alleen het email adres krijgen, hoe vinden ze dan de informatie die in dat mailtje moet komen te staan?
nee, die thread krijgen een hele struct mee, met alle informatie die nodig om te personaliseren. Deze informatie lees ik uit een mysql database en stop ik in de stack. een stack vol met structs dus.

Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Snelheid is inderdaad laag, ik heb in java een server geschreven die grote HTML mails verzend (meerdere batches tegelijk, soms batches van 20.000-60.000 mails). Mails zijn vaak 20-60 kb.

De snelheid die ik haal ligt rond de 50 mails/seconde. Dit is op een celeron 1200 met 512 mb geheugen. Draait op linux, exim als mailserver. Iedere mail gaat naar een ander adres.

Je performance is dus niet echt goed, nee. Ik werk overigens met een verzend-thread per processor, in bovenstaande situatie dus slechts een enkele verzend thread.

Ik denk erover om mijn server in c++ te gaan schrijven, omdat java zo traag is met strings. Vreemd dat je performance zo laag ligt.

Wat tips:
- Haal meerdere records met een query op, sneller dan een query voor ieder record
- Verzend meerdere berichten over een enkele SMTP sessie (dit scheelt enorm)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

TormentoR schreef op 12 September 2003 @ 12:15:
-1- Lees X adressen in uit de database, stop deze in een stack, deze thread zal de stack blijven aanvullen

-2- Start Y threads die uit bovenstaande stack een adres pop() 'n en een gepersonaliseerde mail versturen, deze threads zullen dit blijven herhalen
detail: hier wil je over het algemeen een queue hebben, geen stack. Of moeten de adressen die als laatst zijn toegevoegd als eerst worden gebruikt? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Als ik het goedbegrijp worden de emails door je programma aan elke keer een nieuw process van sendmail doorgegeven. Sendmail zal deze queuen en versturen. Als je programma te snel de mailtjes aanleverd, krijg je dan niet een veel te grote queue en zal je dus niet een bepaalde vertraging in de applicatie moeten aanbrengen?

Je zou ook nog kunnen proberen om via de smtp poort met sendmail te kunnen praten. Dat is misschien niet zo makkelijk als sendmail via de commandline aan te roepen, maar scheeld al wel weer een process dat aangemaakt moet worden. Hoeveel dat in werkelijkheid uit zal maken weet ik niet.

offtopic:
[quote]
Ik denk erover om mijn server in c++ te gaan schrijven, omdat java zo traag is met strings. Vreemd dat je performance zo laag ligt.
[/quote]
Ik neem aan dat je StringBuilder gebruikt voor je strings?

[ Voor 59% gewijzigd door Verwijderd op 13-09-2003 09:32 ]


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Infinitive: Ja, ik heb zo ongeveer alle mogelijke java-optimalisaties al afgelopen:
- custom (non-synchronized) stringbuffer, die ik reset ipv opnieuw instantier
- buffering
- NIO

maar ja, immutable strings zijn gewoon traag (zelfs als ik in java zo min mogelijk kopieer...)

Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

Laat ik net zoiets ook al eerder op m'n stage hebben gemaakt :)
2000 html mailtjes uit een mysql database gepompt via sendmail naar al die adressen in minder dan 10 seconden ( zit ook tijd in van bevestiging op beeldscherm tonen [ tijdsduur van opbouwen van een pagina ] )

hoe ik dat gedaan heb.. in 1 SMTP sessie meerdere COPY als mail versturen.. door allemaal TO adressen in te tikken. voordat je de body van het mailtje maakt..
Daarna natuurlijk het mailtje netjes afsluiten.
Should do the trick :) (via cmdline PHP gaat het overigens nog sneller en nog sneller als je een SMTP connectie via localhost maakt [wat toen niet ter sprake was] )

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

Verwijderd

Kwai_gon_jinn schreef op 16 September 2003 @ 13:44:
in 1 SMTP sessie meerdere COPY als mail versturen.. door allemaal TO adressen in te tikken. voordat je de body van het mailtje maakt..
Daarna natuurlijk het mailtje netjes afsluiten.
Should do the trick :) (via cmdline PHP gaat het overigens nog sneller en nog sneller als je een SMTP connectie via localhost maakt [wat toen niet ter sprake was] )
Dan zijn de mailtjes toch niet gepersonaliseerd? En dan kan iedereen zien naar wie het mailtje nog meer gaat.

  • Zynth
  • Registratie: September 2001
  • Laatst online: 17-09 16:56
Let op, hier komt de gouden tip :P
http://phpmailer.sourceforge.net/
daarmee kan je alles, meerdere bcc's etc.
Hij heeft ook een funtie waarmee je de connectie naar een smtpserver
open kan zetten, en handmatig sluiten.
Dan kan je dus doen:

[pseudocode]
smtp-openen();
while(ermoetnogmailverstuurtworden){
  verstuur een mail;
}
smtp-sluiten();

[/pseudocode]

op die manier hoeft niet voor elke mail een nieuwe
verbinding met de server gemaakt te worden, en kan
het echt wel tot 20x sneller gaan :)
kijk maar even bij de examples; tis echt een eitje...

deze klasse ondersteunt trouwens ook het mailen van attachments etc...

[ Voor 7% gewijzigd door Zynth op 17-09-2003 01:14 ]

Pagina: 1