我有一个服务器应用程序需要使用大量内存,但只需要很少的时间。因此,我认为使用大交换和普通内存来运行它应该是经济的。
当我了解异步磁盘 io 时,我正在阅读有关从磁盘提供大文件的内容,并听说 FreeBSD 比 Linux 更好地支持它。
我的问题是:异步磁盘 IO 是否会影响交换空间的性能,因为交换分区将进行大量磁盘读取和写入。有理由选择 FreeBSD 吗?我有在 Linux(Ubuntu) 上工作的丰富经验,并且更喜欢将其用于应用程序。
答案1
- FreeBSD 中的异步 IO 并不完全比 Linux 中更好。我认为你的来源意味着 AIO 调用系列(
aio_read
等)直接在 FreeBSD 内核中实现,但在可能的情况下在内部将其请求转换为 IOCP(套接字、管道、平面磁盘访问等),并仅为文件系统 I/ 创建内核线程奥。与此不同的是,Linux 使用用户态线程进行 AIO 调用系列,这些线程更加明确,但暴露了它们的工作并且需要更大的线程上下文。所有其他方面都与通用内核架构和性能相关,这取决于许多特性,包括系统管理员调整技能。 - 当 AIO 明确需要线程时,有一些方法 - 主要情况是当文件被内存映射并作为内存区域读取时,并且实际读取被作为页面错误处理。由于页面错误会中断特定的控制流(即线程),因此需要单独的线程进行独立处理。似乎这非常接近您假设的机制,但前提是您正确控制 RAM 使用;这意味着至少需要大量
madvise
呼吁指定哪些区域是需要的,哪些是不需要的。有时直接 *read()/*write() 更容易,因为它们不需要将已处理的段暴露给 RAM。 - AIO 本身与交换没有任何关系。使用任何IO方式都需要以最佳速率输入和输出。但是,问题是,如果您在进程内存中保存大量数据,它将被换出和换入。如果您的“工作集”(应位于 RAM 中的页面集,用于在没有明显进程性能下降的情况下工作)大于适合 RAM(包括内核数据、磁盘缓存等的支出),您将陷入不断的交换中。在这种情况下,应调整算法以保持工作集足够小,这是唯一的解决方案。
- 特别是对于 Linux,请保留问题12309心里。据报道,该问题已修复,但该票证错过了历史记录和后果的重要部分,因此,后期磁盘缓存清除和大规模换出后的问题可能会再次出现。 FreeBSD 的重要区别是 BSD 系统从来没有这个问题。