Ulf Wendel
2003-10-25 15:24:25 UTC
Ahoi,
ich bin gerade etwas verwirrt von der Performance, die meine zwei
kleinen Programme Server und Client messen, wenn sie miteinander reden.
Server und Client kommunizieren über ein Unix Domain Socket miteinander.
Der Client sendet dem Server Dateinamen, die dieser entgegennimmt und
als Antwort den Inhalt der Datei schickt. Das Auslesen der Dateien und
das Senden über das Socket erfolgt mittels drei Varianten: read(),
sendfile(), mmap().
Ich erhalte folgende Laufzeiten für einen Testlauf mit 10.000 Dateien
aus /usr/src/linux:
sendfile()-Variante:
Gesamt: 4.28s
User: 0.08s
System: 1.11s
read()-Variante:
Gesamt: 5.51s
User: 0.17s
System: 1.17s
mmap()-Variante:
Gesamt: 18.57s
User: 0.18s
System: 11.49s
Die Zeiten werden im Server gemessen. Wie ist das Abschneiden von mmap()
zu erklären?
Ein Stückchen mmap() Implementierung habe ich unten angehängt. Der Code
vor und nach dem [...] ist in allen Varianten des Servers identisch.
Danke!
Ulf
[...]
if ((fd = open(filename, O_RDONLY)) == -1) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: failed to open '%s'", filename);
write(con_fd, buffer, strlen(buffer));
return -1;
}
map_ptr = mmap(NULL, stat_info.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (map_ptr == ((caddr_t)-1)) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: mmap() failure on file '%s'", filename);
write(con_fd, buffer, strlen(buffer));
return -1;
}
close(fd);
if (write(con_fd, map_ptr, stat_info.st_size) != stat_info.st_size) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: failed to write %d Bytes to socket", n);
write(con_fd, buffer, strlen(buffer));
return -1;
}
if (munmap(map_ptr, stat_info.st_size) == -1)
log_and_exit("munmap failed");
[...]
ich bin gerade etwas verwirrt von der Performance, die meine zwei
kleinen Programme Server und Client messen, wenn sie miteinander reden.
Server und Client kommunizieren über ein Unix Domain Socket miteinander.
Der Client sendet dem Server Dateinamen, die dieser entgegennimmt und
als Antwort den Inhalt der Datei schickt. Das Auslesen der Dateien und
das Senden über das Socket erfolgt mittels drei Varianten: read(),
sendfile(), mmap().
Ich erhalte folgende Laufzeiten für einen Testlauf mit 10.000 Dateien
aus /usr/src/linux:
sendfile()-Variante:
Gesamt: 4.28s
User: 0.08s
System: 1.11s
read()-Variante:
Gesamt: 5.51s
User: 0.17s
System: 1.17s
mmap()-Variante:
Gesamt: 18.57s
User: 0.18s
System: 11.49s
Die Zeiten werden im Server gemessen. Wie ist das Abschneiden von mmap()
zu erklären?
Ein Stückchen mmap() Implementierung habe ich unten angehängt. Der Code
vor und nach dem [...] ist in allen Varianten des Servers identisch.
Danke!
Ulf
[...]
if ((fd = open(filename, O_RDONLY)) == -1) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: failed to open '%s'", filename);
write(con_fd, buffer, strlen(buffer));
return -1;
}
map_ptr = mmap(NULL, stat_info.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (map_ptr == ((caddr_t)-1)) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: mmap() failure on file '%s'", filename);
write(con_fd, buffer, strlen(buffer));
return -1;
}
close(fd);
if (write(con_fd, map_ptr, stat_info.st_size) != stat_info.st_size) {
snprintf(buffer, BUFFER_SIZE,
"SERVER: failed to write %d Bytes to socket", n);
write(con_fd, buffer, strlen(buffer));
return -1;
}
if (munmap(map_ptr, stat_info.st_size) == -1)
log_and_exit("munmap failed");
[...]