- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在Wikipedia上读到,禁用cpu-cache可以提高性能:
Marking some memory ranges as non-cacheable can improve performance, by avoiding caching of memory regions that are rarely re-accessed.
最佳答案
关于非缓存的评论并不表示您认为的含义,在不使用缓存的地方,它通常不是用户可访问的功能。即,CPU缓存控制通常是特权操作。
那就是...
-可以使用属性为“热”或“冷”的函数来构建普通用户程序,以使编译器告诉加载程序以最有用地利用缓存的方式对函数进行分组。
-普通程序可以使用linux中的madvise()函数来告诉分页函数各种事情,包括以下事实:刚刚使用的内存即将或不可能再次使用。
-内核本身在更高版本的内核中使用内存类型范围寄存器(mtrr)和页面属性表(pat)标志,以告知硬件特定的内存范围(例如内存映射的显示缓冲区以及内存的各个部分)。 PCI总线)将不被缓存。
像您可能在任何C程序中使用的“Normal Data™”基本上不会从标记其任何不值得缓存的数据中受益。未缓存数据带来的性能改进是随后缺少了内存映射的设备和显示缓冲区几乎始终需要的各种缓存刷新和内存屏障操作。例如,在内存映射的设备上放置缓存将需要在每次读取之前使用缓存无效命令,并在每次写入之后需要使用缓存强制写入命令,以确保读取和写入发生在所需的确切时间。这将“毒化”高速缓存的使用,以最不友好,最无益的方式耗尽并立即丢弃高速缓存行(物理上有限的资源)。
在极少数情况下,您编写的程序可以访问这些高速缓存有害区域之一(例如,如果您在Linux系统上编写了X显示服务器的一部分),内核将已经为设备设置了寄存器,并且非缓存行为对您是透明的。
实际上,普通的应用程序级程序几乎没有时间可以从任何将变量标记为有害缓存的功能中受益,而这些变量对各种使用madvise()的类型都是有害的。
即使在那时,您仍然可以从中受益的情况如此罕见,以至于如果您遇到了麻烦,问题集将包括需求和方法论作为研究的一部分,并且您将被告知如何以及为什么因此,您显然不需要问这个问题。
再回到同一示例,如果您正在编写必要的驱动程序,那么当您在显示适配器硬件或PCI总线上进行读取时,各种标志和技术将在硬件指南中进行记录和讨论。 。
有一些方法可以通过在Intel平台上执行CLCLEAR指令之类的操作,从用户空间中实现高速缓存弹出等功能。这些技术不会提高总体性能。
由于它是Linux系统上的特权操作,因此您可以编写一个内核驱动程序来获取并标记内存区域为不可缓存,然后将其映射到应用程序中。但是,对这样一个地区的需求非常少,并且很可能被滥用,以至于没有一个正常的方法来做到这一点。
你是怎么做到的?你不是,至少不是今天的你。当您成为具有多线程代码和数据同步问题的专业知识的内核驱动程序编写者时,您将知道如何做到这一点,届时您将知道为什么不想这样做。最后一招。
TL; DR::由于Linux使用和管理数据及代码的方式,将正常应用程序的任何部分标记为不可缓存不会带来任何好处,不会造成比保存起来更多的伤心欲绝。因此,没有非特权API可以执行此操作。
P.S.此外,也就是说,已经有人指出了导致本文http://lwn.net/Articles/255364/的内容,该文章涵盖了使程序对缓存非常友好的方法,以及一些可以非常廉价地执行某些缓存绕过操作的方法。例如,在设置内存时使用memset()往往会绕过缓存,并且某些操作会“流过”缓存。这与您要问的不一样,但是一旦您理解了所有文章,您将更好地理解为什么像Jedi所说的那样,将内存区域标记为不可缓存通常不是您想要的解决方案寻找。
关于c - 如何为某些内存区域禁用CPU缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426921/
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!