zoidberger
Mitglied
Hallo mal wieder!
Heute habe ich eine etwas komplexere oder vlt. tiefgreifendere Frage für euch.
Möglicherweise könnte man sie abkürzen mit "was hat die Zahl 16384 mit memcpy" zu tun..
naja, ich versuchs mal mit einer theoretischen erklärung:
Ich habe hier mehrere applikationen auf einem server auf dem linux läuft.
Die Prozesse nutzen den Server ganz gut aus, dies schwankt allerdings ziemlich.
Die Prozesse sind so genannte TCP relays, die daten entgegennehmen und an Prozesse auf anderen Servern weiterleiten oder umgekehrt.
Die TCP relays haben einen ringbuffer, der automatisch vergrößert wird, wenn er zu einem gewissen Prozentsatz gefüllt ist.
Dies funktioniert bei vielen der relays ohne Probleme.
Nur bei einem bzw. zwei kommt es ab und zu zu einem crash.
Wenn ich mir das corefile anschaue sehe ich die Zeile in der es passiert ist und wie groß die var 'r_buff' zu diesem Zeitpunkt ist.
in der Zeile 'void* r = memcpy(buff+write_pointer, r_buff, w_size);'
passiert der Fehler.. und laut core file ist r_buff = 16384 groß.
Wenn der Arbeitsspeicher des Servers ausgelastet wäre, sollte eigentlich der swap übernehmen.. wenn es einen fehler bei memcpy gäbe, sollte es eigentlich durch die if klausel abgefangen werden.. aber soweit kommt es im fehlerfall nie.
Hat denn jemand eine Idee was da das Problem sein könnte?
Reproduzierbar ist dieser Fehler jedenfalls nicht..
Beste Grüße
Zoid
Heute habe ich eine etwas komplexere oder vlt. tiefgreifendere Frage für euch.
Möglicherweise könnte man sie abkürzen mit "was hat die Zahl 16384 mit memcpy" zu tun..
naja, ich versuchs mal mit einer theoretischen erklärung:
Ich habe hier mehrere applikationen auf einem server auf dem linux läuft.
Die Prozesse nutzen den Server ganz gut aus, dies schwankt allerdings ziemlich.
Die Prozesse sind so genannte TCP relays, die daten entgegennehmen und an Prozesse auf anderen Servern weiterleiten oder umgekehrt.
Die TCP relays haben einen ringbuffer, der automatisch vergrößert wird, wenn er zu einem gewissen Prozentsatz gefüllt ist.
Dies funktioniert bei vielen der relays ohne Probleme.
Nur bei einem bzw. zwei kommt es ab und zu zu einem crash.
Wenn ich mir das corefile anschaue sehe ich die Zeile in der es passiert ist und wie groß die var 'r_buff' zu diesem Zeitpunkt ist.
Code:
if (size >= free_size())
{
LOG("\tNot enough free_space=%d. Trying to increase. \n",
free_size());
if (increase_in_pct(reallocate_in_pct) == -1) {
LOG("\tIncrease failed \n")
return -1;
}
}
// Copy as much as we can until the end of the buffer.
// leave the rest for the recursion below where the wp is moved to 0
if ((write_pointer + size) > buff_size) {
w_size = buff_size - write_pointer;
}
void* r = memcpy(buff+write_pointer, r_buff, w_size);
if (r == NULL) {
LOG("\tOops. memcpy error.");
return -1;
}
in der Zeile 'void* r = memcpy(buff+write_pointer, r_buff, w_size);'
passiert der Fehler.. und laut core file ist r_buff = 16384 groß.
Wenn der Arbeitsspeicher des Servers ausgelastet wäre, sollte eigentlich der swap übernehmen.. wenn es einen fehler bei memcpy gäbe, sollte es eigentlich durch die if klausel abgefangen werden.. aber soweit kommt es im fehlerfall nie.
Hat denn jemand eine Idee was da das Problem sein könnte?
Reproduzierbar ist dieser Fehler jedenfalls nicht..
Beste Grüße
Zoid