【发布时间】:2016-05-13 12:32:39
【问题描述】:
我已经阅读了一些关于 Elixir 和 Erlang 如何使用硬件的性能声明,我想看看我是否理解它们的基础。一些背景:
首先,Erlang 支持将不可变字符串(iolists)的嵌套列表写入 IO(文件、套接字等)并使用 writev 和字符串的内存地址 (see Evan Miller's blog post on this)。
其次,the docs for an Erlang web framework called Chicago Boss 说:
Erlang 尊重你的内存!
Erlang 与其他平台不同,因为在渲染服务器端模板时,它不会在内存中为每个连接的客户端创建单独的网页副本。相反,它跨多个请求构造指向同一块不可变内存的指针。
因此,如果两个人同时请求两个不同的个人资料页面,他们实际上会收到相同的内存块,用于页眉、页脚和其他共享模板 sn-ps。结果是服务器可以为数百名用户每秒构建复杂的、未缓存的网页而不会费力。
第三,a book about an Elixir (Erlang VM) web framework called Phoenix 说:
模板是预编译的。 Phoenix 不需要为每个渲染的模板复制字符串。 在硬件级别,您会看到缓存在这些字符串中发挥了前所未有的作用。
从源码看,我知道这个框架使用iolists来表示一个完整的响应模板。
把所有这些放在一起,我认为暗示的是,如果一个 web 框架使用writev 告诉操作系统从相同的内存位置发送相同的页眉和页脚字符串,一个 web一个又一个请求,硬件会说“哦,我知道那个值,它已经在 CPU 缓存中,所以我不必在 RAM 中查找它。”
是这样吗?(我对系统调用和硬件知之甚少。)如果不是,有什么关于如何涉及硬件缓存的想法吗?
(如果你能告诉我如何查看或推断正在发生的事情,那将是额外的奖励。)
【问题讨论】:
-
Evan Miller 的电子邮件回复:“您将通过 iolist 和共享(引用计数)字符串(>64 字节)获得这种缓存利用率。Writev 允许您跳过最终的 memcpy / flattening,这可能会导致在某些负载中更好地利用缓存。测试和测量!”