Articles of 虚拟内存

如何findSQL Server 2008上内存压力故障的根本原因?

我一直在进行性能监控的服务器之一,开始从资源耗尽探测器发出以下警告: Windows成功诊断出虚拟内存不足的情况。 以下程序消耗的虚拟内存最多:sqlservr.exe(1560)消耗了14960812032个字节,ReportingServicesService.exe(1936)消耗了506359808个字节,w3wp.exe(7376)消耗了273764352个字节。 SystemCommitLimit 38068215808 SystemCommitCharge 37800669184 ProcessCommitCharge 16727490560 PagedPoolUsage 359088128 PhysicalMemorySize 17098584064 PhysicalMemoryUsage 16881131520 NonPagedPoolUsage 221425664进程48 这个服务器是windows server 2008,运行MSSQL 2008 R2,有16GB的RAM和24个处理器。 它运行SQL,并为数据访问SQL的Web服务。 我引用的数字来自事件查看器的详细信息部分。 我一直无法找出根本原因。 我已经知道SQL需要大量的内存来运行,而且当时使用了大量的内存,但是我也把它设置为14000MB。 除Resource-Exhaustion-Detector警告外,SQL开始出现Out of Memory错误。 find根本原因的最佳方法是什么? 我没有看到任何在日志中看起来不寻常的东西。 经过几个小时的这个错误重复一遍又一遍,内存终于耗尽,服务开始失败,直到服务不得不重新启动。 当有压力的时候,SQL是不是聪明地放弃了一些内存呢? 页面文件(虚拟内存)是20GB,而SQL只使用了16GB的物理内存。 什么填补了虚拟内存的其余部分? SQL实际上是使用所有的页面文件? 我应该寻找内存泄漏吗? 日志文件增长? 服务器上使用最多的.mdf每天增长大约100MB。 日志文件一直在增长3GB,现在是40GB。 通常当有内存压力时,我们从来没有到达服务器崩溃的地步。 它通常只是缓慢地运行,直到压力消失。 有没有办法有效地阻止这个问题的发生?

什么是非分页池?

我有一个日常维护的Server 2008 R2。 服务器是好的,运行良好,但它不断发送我的事件2019错误日志。 “服务器无法从系统非分页池中分配,因为池是空的。” 非分页内存与虚拟内存相同吗? 分页内存和物理内存一样吗? 如何检查系统或驱动程序是使用物理还是虚拟内存? 我检查任务pipe理器 – >性能,看看它是否已经分配在系统上的非页面内存,它的确如此。 我只是想知道这个错误是想说或者警告我。 谢谢

Linux OOM磁盘I / O。 另外:交换,有什么好处?

我在Linux(2.6.37)安装中遇到了OOM杀手的问题。 电脑有4GB的内存,我有时充分利用。 在这种情况下,我希望OOM处理程序能够通过杀死一个或两个进程来完成工作。 而不是这样做,或者试图这样做,系统locking,做磁盘I / O,就像没有明天一样。 这是事情:我没有任何交换启用。 出于某种原因,我的swapless系统仍然locking了大量的磁盘I / O,即使适当的行动是杀死一个或两个进程。 思考? 整个问题让我怀疑Linux是否需要以某种我不知道的方式进行交换。 解释是否是这种情况,为什么会不胜感激。 我在概念层面(即虚拟内存,分页,过度使用)熟悉交换的想法,但是我想知道是否有任何实现细节可能已经错过了。

Windows Server任务pipe理器显示比所有进程的工作集大小之和高得多的内存使用量

我有一台主要运行SQL Server 2008的16 GB Windows Server 2008 x64计算机。在任务pipe理器中看到的可用内存非常低(目前为128 MB),即大约使用15.7 GB。 到现在为止还挺好。 现在,当我尝试使用大多数内存来缩小进程的范围时,我感到困惑:没有一个进程的任务pipe理器的“进程”选项卡中显示的工作集大小超过了200MB。 那么,也许工作集大小不是相关的计数器? 为了解决这个问题,我使用了一个PowerShell命令[1]来总结过程对象的每个单独的属性,采用暴力方法 – 当然,其中一个必须加起来为15.7 GB,对吧? 结果都没有,最接近的是VirtualMemorySize(大约12.7 GB)和PeakVirtualMemorySize(大约14.7 GB)。 WTF? 换句话说:许多与内存相关的进程信息中的哪一个是“正确的”,即在任务pipe理器的“性能”选项卡中显示的服务器的物理内存? 谢谢你们! [1] $ erroractionpreference =“默默继续”; get-process | gm | where-object {$ .membertype -eq“Property”} | foreach-object {$ .name; (get-process | measure-object -sum $ _。name).sum / 1MB}

为什么Windows Server 2012 R2标准版只显示我可用内存的20%?

技术人员 – 我有一个基于LENOVO x3650 X6 / x64的Windows服务器,带有4个18核/ 36个逻辑处理器 – 安装了1.5TB的物理内存(ram),1.5TB的总虚拟内存。 但是,我只显示了295 GB的可用物理内存,只有297 GB的可用虚拟内存。 发生了什么? Windows Server 2012 R2标准版6.3.9600版本生成9600是否会造成限制? 我知道,在2008年的Windows产品世界中,企业版和标准版存在差异 – 但2012服务器版的命名约定是不同的。 有一个windows服务器2012的Windows产品的数据中心类 – 这是相当的? 我走错路了吗? 我应该看一个不同的解释,为什么我只显示我认为应该提供的20%?

不同的linux页面caching行为为服务器做同样的工作

我有两组服务器(128位内存),它们在configuration时会有区别,在运行完全相同的守护进程(elasticsearch)时performance得非常不同。 我正在使用elasticsearch进行全文search,而不是日志存储,所以这个基本上只需要很less的写操作(小于1MB / s)的读操作。 这个守护进程mmap将大约350GB的完整数据集放入其虚拟内存中,然后访问它的某些部分来处理请求。 这些服务器没有configuration交换空间。 问题是一组服务器运行良好,每秒发出大约50个重大故障,平均需要10MB / s的磁盘IO来满足这个需求。 性能不佳的服务器每秒可以看到500个重大故障,平均需要200MB / s的磁盘来满足这个要求。 磁盘IO的增加导致较差的p95响应延迟和偶然的过载,因为它达到约550MB / s的磁盘限制。 他们都坐在同一个负载平衡器后面,并且是同一个集群的一部分。 我可以看到,如果一台服务器的性能不好,可能是负载的差异,但是与16台服务器的性能差别很大,20台服务器的性能不错,在不同的时间内,它们被淘汰+供应,内核/configuration级别必须引起问题。 为了解决这个问题,我该如何让这些performance不佳的服务器像那些performance良好的服务器一样行事? debugging工作应该集中在哪里? 下面是我收集的一些数据,用来查看系统在三种状态中的每种状态下的sar和page-types工具的function。 软件: – debian jessie – linux 4.9.25 – elasticsearch 5.3.2 – openjdk 1.8.0_141 首先从一个performance良好的服务器(来自sar -B )的一些页面错误数据: 07:55:01 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 08:05:01 PM 3105.89 811.60 2084.40 48.16 3385.30 0.00 […]

你如何衡量一组分叉进程的内存占用?

说我有一个使用200MB内存的进程,它fork()s: python -c "import os; data='x'*200000000; os.fork(); raw_input()" 像“顶”这样的程序将显示每个使用200MB的进程,而SHRd内存很less,所以看起来好像进程总共使用了400MB。 但是,由于fork()为进程的内存页面实现了写入时拷贝(COW),实际上这些进程总共只用了200MB。 为什么不顶部显示内存的一部分是COW? 有没有办法让它这样做? 还是有另一个我可以使用的命令? 注意:在OSX上的“顶部”似乎有一个RSHRD列,做我所期望的。 我的问题是针对Linux。

当内存占用过多时自动挂起/hibernate进程

我正在使用16GB内存的8核PC上运行一个小型的Debian计算集群。 我正在运行大约1k个任务的批次(每个批次总共有一个月的预计完成时间)。 一个任务是单线程的(所以我可以在每台PC上并行运行多个),不会消耗太多的IO(在启动时加载几兆字节的数据,在退出时转储数兆字节的数据;不与外部通信否则),其运行时间是未知的(从几分钟到几周),其内存消耗是未知的(从几兆字节到8GB;使用可能增长缓慢或快速)。 我想尽可能在​​单台PC上同时完成多项任务,但是我想避免过多的交换。 所以我有一个想法:我可以监视这些任务的内存使用情况,并暂停( kill -SIGSTOP )或hibernate(使用类似CryoPID的工具)任务,这些任务会消耗太多的内存以便稍后重新启动。 内存使用量是指“活动虚拟页面”的数量,或者实际上已经被触摸的已分配但不是共享的内存页面的数量(这些任务可以在不使用它们的情况下分配内存)。 我开始寻找一些工具来做到这一点。 我知道我可以在限制内存的cgroup中限制或运行任务,但是如果我正确理解这些任务,这些解决scheme将会终止进程,而不是暂停进程。 我想避免杀死他们,因为我需要从头开始,这意味着浪费时间。 而且,他们实际上不能测量活动虚拟页面的数量。 我可以使用真正的虚拟机,但是在这种情况下它们似乎具有相当大的开销 – 具有单独的内核,内存分配等会减less可用内存; 我必须运行其中的8个。 而且,据我所知,他们也会增加计算开销。 我想象一个实现这种行为的工具会把一些函数连接到一个页面错误通知,它会决定每个页面错误是否是暂停过程的时间。 但我不知道任何可以这样工作的工具。 还有其他的select吗?

内存过度使用VMware ESXi 5.0

我想更好地了解VmWare ESXi内存过度使用的可能性。 我已经从VmWare读过这篇文章 ,所以我熟悉一些通用概念,比如pipe理程序交换,内存挂载和页面共享。 看来,这些技术的组合允许相当大程度的过度承诺。 但是,我不确定。 我正在部署一个虚拟testing实验室,该实验室由4套相同的虚拟服务器和工作站以及一些虚拟路由器实例组成。 总体而言,我预计将运行20台虚拟机,其中Windows XP,Windows 7和Ubuntu用于工作站主机,以及用于服务器的CentOS和Windows 2008 Server实例。 但是,问题是,主机只有12GB的内存,我没有select一些东西。 我想知道什么是configuration主机的最佳select,以达到约束内的合理性能。 我有这两个select: 为每个虚拟机分配尽可能less的RAM。 分配一个非常的数额(例如每个实例4 GB),让气球驾驶员完成剩下的工作。 别的东西? 哪个更好? 机器大多会闲置,所以我没有什么重大的性能期望,但是它们应该顺利运行。

基于哪个Linux交换进程内存从RAM到交换文件的确切条件是什么?

我的服务器有8G的内存和8Gig的交换文件configuration。 我有内存密集型应用程序运行。 这些应用程序具有峰值负载,在此期间我们发现交换使用率增加 大约使用1 GIG交换。 我有另一台服务器,内存4Gigigs和8Gig的交换和类似的内存密集型应用程序运行。 但是这里的交换使用是非常可以忽略的。 大约100 MB。 我想知道什么是确切的条件或一个粗略的公式,基于哪个Linux将交换RAM中的进程内存交换文件。 我知道它基于交换因素。 还有什么是基于? 交换文件大小? 任何指向Linux内核文档/源代码的指针都会很好。