2010-08-20 3 views
1

Я играю с этим кодом на Linux 2.6.16.46:использовать aio_write(), но все еще видеть данные, проходящие через кеш?

io.aio_fildes = open(name, O_CREAT | O_TRUNC | O_WRONLY | O_SYNC, 00300); 

io.aio_buf = buffer; 
io.aio_nbytes = size; 
io.aio_sigevent = sigev; 
io.aio_lio_opcode = LIO_WRITE; 

aio_write(&io); 

Это должно использовать память, на который указывает буфер для операции ввода-вывода. Тем не менее, я вижу, что количество грязных страниц растет, как если бы я писал в кеш. Почему это?

На строительной машине нет поддержки O_DIRECT в open(). Но поскольку я не использую write(), это должно быть проблемой?

Я уверен, что есть прямая поддержка IO на цели.

+0

Потому что реализация aio не так хороша, как должна быть? Я не отправляю это как ответ, потому что мои знания об aio довольно старые, и я не проверял, улучшилось ли это за последние годы. Пять лет назад это была просто оболочка совместимости с API, но никаких улучшений нет. – Lothar

+0

хорошо. На целевой машине, которая равна 2.6.27.19, прямое IO поддерживается в ядре как минимум. Но у него нет компилятора. На машине сборки open() не принимает O_DIRECT. Означает ли это, что у меня есть старая библиотека? –

ответ

1

понял это. Прямой/буферизованный IO - это одно, синхронизация/асинхронность - другое. Чтобы асинхронные записи избегали кэширования, все еще нужно дать O_DIRECT вызову open(), даже если write() не используется.

Вероятно, сначала возникнут ошибки компилятора - внимательно прочитайте man 2.

Смежные вопросы