我的服务器有以下要求:
1) 每个与服务器的新连接都会触发一系列 N posix_fadvise 调用。2) 每个连接的前几个 fadvise 调用应尽快发生 3) 如果客户端发出后续请求,则能够重新排序 fadvise 调用。
我在想:带有共享队列的线程池,其中线程池大小约为 100。还有其他建议吗?
我的服务器有以下要求:
1) 每个与服务器的新连接都会触发一系列 N posix_fadvise 调用。2) 每个连接的前几个 fadvise 调用应尽快发生 3) 如果客户端发出后续请求,则能够重新排序 fadvise 调用。
我在想:带有共享队列的线程池,其中线程池大小约为 100。还有其他建议吗?
假设你在谈论POSIX_FADV_WILLNEED
:
posix_fadvise
已经是异步的了。也就是说,它会启动内核的机制以在后台开始分页数据,但它实际上并不等待任何数据被读取。它立即返回。
换句话说,posix_fadvise
它已经是一种并发机制,因此产生自己的线程来调用它是没有意义的。并且没有办法“重新排序”调用,因为一旦它们被交给内核,内核就会自己决定如何重新排序磁盘访问。
如果您真的想自己动手,只需让您的线程一遍又一遍地进行阻塞 read() 调用以读取较小的块(例如 8k)。(也就是说,重复顺序读取同一个 8k 缓冲区。使用同一个缓冲区会将其保留在 L1 缓存中,并避免不必要地敲击内存总线。)这将填充页面缓存并让您控制它何时发生。
我有点怀疑你的应用程序需要这样的机制,虽然......
为同一个底层设备同时阻塞多个线程是没有意义的fadvise
,因为无论如何它们都共享同一个请求队列。
这意味着您应该只需要一个预读线程,它从队列中获取预读请求并按顺序执行它们。