我读过一些关于Elixir和Erlang如何使用硬件的性能声明,我正在试图了解它们的基础。一些背景:
首先,Erlang支持将不可变字符串(Iolist)的嵌套列表(Iolist)写入IO (文件、套接字等),并使用writev和字符串的内存地址(请参阅Evan Miller的博客文章)。
其次,一个名为芝加哥老板的Erlang web框架的文档说:
Erlang尊重你的RAM! Erlang不同于其他平台,因为当呈现服务器端模板时,它不会为每个连接的客户端创建单独的网页副本。相反,它在多个请求中构造指向相同不可变内存段的指针。 因此,如果两个人同时请求两个不同的配置文件页,它们实际上被发送给页眉、页脚和其他共享模板片段的相同内存块。其结果是一台服务器可以为数百名用户每秒构建复杂的、非缓存的网页,而无需费力。
第三,一本关于名为凤凰的Elixir (Erlang ) web框架的书说:
模板是预编译的。菲尼克斯不需要为每个呈现的模板复制字符串。在硬件级别上,您将看到缓存在这些字符串中发挥作用,而这些字符串在之前从未使用过。
通过查看源代码,我知道这个框架使用iolist来表示一个完整的响应模板。
把所有这些加在一起,--我认为隐含的是,如果一个web框架使用writev告诉操作系统从相同的内存位置发送相同的页眉和页脚字符串,一个又一个的web请求,硬件将能够说:“哦,我知道这个值,它已经在CPU缓存中了,所以我不必在内存中查找它。”
是对的吗?(我对系统调用和硬件了解很少)。如果没有,对于如何涉及硬件缓存,有什么想法吗?
(如果你能告诉我怎么看或推断出发生了什么,那就更好了。)
发布于 2016-05-13 04:32:39
是的,帮助你的主要是处理器缓存。检索数据所需的时间更短,因为它在更快的内存中(即CPU缓存)。
理解缓存是什么以及它们是如何工作的一些提示:
要查看这一点,请度量请求在正常服务器操作中所花费的时间(客户端)。在此之后,在同一个vm中有一个单独的进程,不断地创建一个非常大的字符串并将其写入磁盘(它的大小可能必须是on -不管进程上L2/L3缓存的大小如何)。重新测量请求所需的时间--如果操作正确,则至少要慢一个数量级。
https://stackoverflow.com/questions/37167918
复制相似问题