【问题标题】:How are buffer sizes chosen?如何选择缓冲区大小?
【发布时间】:2014-08-19 06:12:53
【问题描述】:

我正在阅读 TLPI(Linux 编程接口),他们似乎使用 1024 作为 fileio 操作的标准缓冲区大小。我想知道为什么选择这个尺寸。是否存在“最佳”文件大小?

详细说明并希望获得进一步的见解:在哪些情况下使用 512 或 2048 字节会破坏某些内容?我假设如果 1024 是安全的,那么 512 也是安全的,但速度较慢,因为您必须以两倍的步数移动数据。所以,如果我的想法是正确的,缓冲区越大,操作越快,但这也增加了失败的可能性?

【问题讨论】:

  • 1K 是计算机喜欢丢弃的数据量。例如IP协议
  • TLPI 第 13 章的大部分内容都在讨论这类事情。

标签: c linux


【解决方案1】:

虽然我经常看到像您这样的哲学问题被否决并关闭,但我仍然喜欢它们以及它们鼓励的讨论。 (我试图将所有内容都放在评论中,但它不太管用。)

简短的回答是合理的小缓冲区是安全的,并且它们通常被选择为正在操作的结构的最小公分母(例如您的示例,1,024,因为大多数文件系统分配1 KB 的倍数(即 1,024 字节)。

更长的答案是可变缓冲区大小(通常大于安全默认值)在软件与硬件甚至工作负载类型交互时对软件的最佳性能起着非常重要的作用。没有适用于所有硬件和操作系统环境的最佳大小。调整缓冲区大小是使程序在您的系统上更好地工作的一种廉价方法。因此,一些不诚实的软件开发人员也使用它来假装他们的软件更好。例如,考虑 Web 服务器软件。您可以通过调整其所有缓冲区大小来声称您的 Web 服务器软件具有更好的性能,然后将其与具有默认配置的 Apache 安装进行比较。例如,您还可以通过使用与一个软件的设置相匹配但导致另一个软件为每个请求使用额外帧的内核调整来在外部限制软件。

以这种方式进行调整也很危险,因为它可能更容易执行拒绝服务攻击,例如“slow loris”/资源耗尽。因此,再次强调,越小越安全,尽管不一定“更好”,具体取决于您对安全性与性能的优先级。

【讨论】:

    【解决方案2】:

    任何时候 Linux 代码引用block size,它几乎总是1024 bytes。 Linux 使用 1024 字节块作为缓冲区缓存等。

    当然,Linux 文件系统通常会实现交替的块大小。标准的 ext3 文件系统块大小通常为 4096 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2014-06-10
      相关资源
      最近更新 更多