LINUX.ORG.RU

sendfile из файла в файл не работает?


1

0

sendfile в принципе не работает на ядрах 2.6.x?
Судя по man sendfile всё должно работать, а у меня стабильно
возвращает EINVAL. Ядро 2.6.18.

Единственное, что нашёл по этому поводу:
http://ilia.ws/archives/13-sendfile-syscall-and-why-the-2.6-linux-kernel-sucks!.
html

Благо, теперь появился новый способ быстрого копирования - с помощью
splice(), с ним всё нормально работает.

Тестовая программа:

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sendfile.h>
#include <unistd.h>
#include <fcntl.h>

int main (int argc, char **argv)
{
    int     fd_in,
	    fd_out;
    off_t   offset;
    ssize_t last_sent;

    if (argc < 3) {
	fprintf (stderr, "2 arguments required\n");
	return -1;
    }

    fd_in = open (argv [1], O_RDONLY);
    if (fd_in == -1) {
	perror ("open #1");
	return -1;
    }

    fd_out = open (argv [2], O_WRONLY | O_CREAT);
    if (fd_out == -1) {
	perror ("open #2");
	return -1;
    }

    offset = 0;
    for (;;) {
	last_sent = sendfile (fd_out, fd_in, &offset, 1 << 20);
	if (last_sent < 0) {
	    perror ("sendfile");
	    return -1;
	}

	if (last_sent == 0)
	    break;
    }

    fprintf (stderr, "OK\n");

    return 0;
}

Ответ на: комментарий от roy

Хуже того, я пропатчил команду cp из coreutils, чтобы она использовала splice()/splice() вместо read()/write(), и работает даже немного медленнее :-)

Можете сами убедиться. Для всего нужно свежее ядро (у меня 2.6.18, вроде должно и на 2.6.17, но не меньше).

патч к coreutils-6.3:

http://mync.sourceforge.net/patch-coreutils-6.3-splice

готовый бинарник cp (работает только при копировании с ext2/ext3 на ext2/ext3):

http://mync.sourceforge.net/cp

erDiZz
() автор топика
Ответ на: комментарий от erDiZz

Ну, существенного выигрыша по скорости быть и не может (откуда? процесс IO-bound). А вот system time для варианта splice должно быть меньше.

А замедление, скорее всего, из-за дискового планировщика. У тебя anticipatory?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

да, у меня anticipatory, но прямой зависимости я не вижу: слишком простая схема, чтение-запись (в обычном cp у меня буфер ~12Кб) против чтения 64Кб в pipe (максимум для pipe-буфера) и записи 64Kb из pipe-буфера в файл...

erDiZz
() автор топика
Ответ на: комментарий от erDiZz

> у меня anticipatory, но прямой зависимости я не вижу

anticipatory специально иногда тормозит seek. Попробуй с deadline или noop.

tailgunner ★★★★★
()

А че, поиск нынче не в моде? Каждый настоящий пацан просто обязан задать вопрос, работает ли sendfile из файла в файл...

anonymous
()
Ответ на: комментарий от Teak

>Где-то я натыкался на письмо Линуса, где он писал, что это misfeature и
> мы мол её пофиксили.

Ну я писем Линуса не читал. Но по коду могу судить, что в 2.4 соответствующая поддержка была сознательно, а в 2.6 она настолько же сознательно не присутствует. Видимо, действительно генеральная линия партия ушла от этого...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.