Linux: каков наиболее масштабируемый дизайн для системного вызова, такого как fadvise в потоке? - PullRequest
1 голос
/ 05 июня 2011

Мой сервер имеет следующие требования:

1) каждое новое соединение с сервером будет запускать серию вызовов N posix_fadvise. 2) первые несколько телефонных вызовов должны быть выполнены как можно скорее 3) возможность переупорядочивать федвис звонки, если клиент делает последующие запросы.

Я думаю: пул потоков с общей очередью, где размер пула потоков равен ~ 100. Любые другие предложения?

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Если вы говорите о POSIX_FADV_WILLNEED:

posix_fadvise уже асинхронно.Таким образом, он запускает механизм ядра, чтобы начать подкачку данных в фоновом режиме, но на самом деле он не ждет, пока какие-либо данные будут прочитаны.Он возвращается немедленно.

Другими словами, posix_fadvise уже является механизмом параллелизма, поэтому создание собственных потоков для его вызова не бессмысленно.И нет никакого способа «переупорядочить» вызовы, потому что, как только они будут переданы ядру, ядро ​​решит, как переупорядочить обращения к диску.

Если выочень хочется накатить свои собственные, просто сделайте так, чтобы ваши потоки делали блокирующие вызовы read () снова и снова, чтобы читать блоки маленького размера (например, 8k).(То есть последовательно последовательно считывайте один и тот же буфер 8 КБ. Использование этого же буфера сохранит его в кэше L1 и позволит избежать ненужного забивания шины памяти.) Это заполнит кэш страницы и даст вам некоторый контроль над тем, когда это происходит.*

Я немного скептически отношусь к тому, что вашему приложению нужен такой механизм, хотя ...

0 голосов
/ 06 июня 2011

Нет смысла одновременно блокировать несколько потоков в fadvise для одного и того же базового устройства, поскольку они все равно совместно используют одну и ту же очередь запросов.

Это означает, что вам нужен только один поток readahead, который принимает запросы readahead из очереди и выполняет их последовательно.

...