有没有办法检测 Linux 上的内存碎片?这是因为在一些长时间运行的服务器上,我注意到性能下降,只有在重新启动进程后,我才能看到更好的性能。在使用 Linux 大页面支持时,我注意到更多——Linux 中的大页面是否更容易碎片化?
我/proc/buddyinfo特别看过。我想知道是否有更好的方法(不仅仅是 CLI 命令本身,任何程序或理论背景都可以)来查看它。
我知道有真正的三个种类的碎片,我需要被关心的DBA:
SQL 数据文件中的索引碎片,包括聚集索引(表)碎片。使用 DBCC SHOWCONTIG(在 SQL 2000 中)或 sys.dm_db_index_physical_stats(在 2005+ 中)识别这一点。
SQL 日志文件中的VLF 碎片。运行 DBCC LOGINFO 以查看每个 SQL 日志文件中有多少 VLF。
硬盘驱动器上数据库文件的物理文件碎片。使用 Windows 中的“磁盘碎片整理程序”实用程序对此进行诊断。(灵感来自这篇优秀的博客文章)
很多注意力都集中在索引碎片上(请参阅Paul Randall 的这个出色的 Serverfault 回答),所以这不是我的问题的重点。
我知道我可以在最初创建数据库时通过规划合理的预期数据文件和日志大小来防止物理碎片(和 VLF 碎片),因为这种碎片最常发生于频繁的增长和收缩,但我有一些关于如何修复的问题一旦识别出物理碎片:
首先,物理碎片是否与企业 SAN 相关?我可以/应该在 SAN 驱动器上使用 Windows 碎片整理程序,还是 SAN 团队应该使用内部碎片整理实用程序?在 SAN 驱动器上运行时,我从 Windows 工具获得的碎片分析是否准确?
物理碎片对 SQL 性能的影响有多大?(让我们假设一个内部驱动器阵列,等待上一个问题的结果。)它比内部索引碎片更重要吗?或者它真的是同一类问题(驱动器必须进行随机读取而不是顺序读取)
如果驱动器存在物理碎片,碎片整理(或重建)索引是否是在浪费时间?在我解决另一个问题之前,我需要先修复一个吗?
在生产 SQL 机器上修复物理文件碎片的最佳方法是什么?我知道我可以关闭 SQL 服务并运行 Windows Defrag,但我也听说过一种技术,您可以执行完整备份,删除数据库,然后从备份还原到空驱动器。是否推荐使用后一种技术?从这样的备份中恢复是否也会从头开始构建索引,从而消除内部索引碎片?或者它只是将页面顺序返回到与备份时相同的顺序?(如果这很重要,我们正在使用带有压缩的 Quest Lightspeed 备份。)
更新:到目前为止,关于是否对 …
对 linux IO 系统有一定经验的人的任何见解都会有所帮助。这是我的故事:
最近建立了一个由六个 Dell PowerEdge rx720xds 组成的集群,通过 Ceph 提供文件。这些机器在两个插槽上有 24 个内核,有两个 numa 区域和 70 GB 的内存。磁盘被格式化为一个磁盘的突袭(否则我们看不到直接暴露它们的方法)。网络由 mellanox infiniband IP over IB 提供(IP 数据包在内核领域变成 IB,而不是硬件)。
我们将每个 SAS 驱动器安装如下:
# cat /proc/mounts | grep osd
/dev/sdm1 /var/lib/ceph/osd/ceph-90 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdj1 /var/lib/ceph/osd/ceph-87 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdu1 /var/lib/ceph/osd/ceph-99 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdd1 /var/lib/ceph/osd/ceph-82 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdk1 /var/lib/ceph/osd/ceph-88 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdl1 /var/lib/ceph/osd/ceph-89 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdh1 /var/lib/ceph/osd/ceph-86 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdo1 /var/lib/ceph/osd/ceph-97 xfs …Run Code Online (Sandbox Code Playgroud) 我有一个 mssql 数据库,我们称之为:mssqlDB01。我的任务是对所有表执行碎片整理。这个数据库有几百个表,每个表都有 1 到 15 个索引。
谷歌让我发现了一种对每个表的所有索引进行碎片整理的做法,但我无法弄清楚如何在所有表上执行此操作。
ALTER INDEX ALL ON TABLENAME REBUILD;
Run Code Online (Sandbox Code Playgroud)
我要找的是
ALTER INDEX ALL ON * REBUILD;
Run Code Online (Sandbox Code Playgroud)
但它抱怨
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '*'.`
Run Code Online (Sandbox Code Playgroud)
下面让我找到我的数据库中的所有表
SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式将其推送到命令中吗?
ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
Run Code Online (Sandbox Code Playgroud) 我有一个 Redis 3.0.5 实例,随着时间的推移,它往往会显示 mem_fragmentation_ratio 的增长。
使用该实例的应用程序不断地创建和删除密钥。
一个月后,我的结果是 mem_fragmentation_ratio > 1.30。这会影响 Redis 在该服务器上的内存占用:
~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
如果我重新启动 Redis 服务并从 AOF 重新加载,mem_fragmentation_ratio 会回到可接受的水平 (1.06):
~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
回收 Redis 正在影响我们的应用程序(即使我们在从服务器重启后使用 Sentinel 故障转移来执行此操作)。
是否有另一种方法可以减少 mem_fragmentation_ratio,例如我可以安排非高峰期的“碎片整理”过程?
这是关于 Windows,但我相信它也适用于其他操作系统。
我听说有人说如果你想要更好的性能,你应该避免交换文件碎片。为此,您可以手动为交换文件指定恒定大小,甚至将其移动到专用分区/磁盘。
这真的会带来任何性能优势吗?毕竟 - 交换文件无论如何都是以随机方式访问的,还有什么更多的随机化?如果您正在考虑为交换文件使用单独的磁盘,那么您最好将资金投入更多 RAM。当然,除非您碰巧获得免费磁盘。
那么 - 是否有必要对抗交换文件碎片?
我们有一台带有 RAID 卷的服务器。Windows DEFRAG 在卷上显示非常高的碎片 (90%)。我的主管询问 DEFRAG 报告的碎片是否正确(或接近正确)。
我们很长一段时间都没有进行任何碎片整理(至少在过去的 4 个月里,我在这里工作的时间里没有)。这是一个生产服务器,我们非常担心。
既然tmpfs只存在于内存中,它会像内存一样变得碎片化吗?是否有机制可以自动对内存进行碎片整理,从而提高(甚至略微提高)存储文件的访问速度?
我正在使用带有多个硬盘驱动器的 Windows 存储空间。
如果我创建多个虚拟磁盘,然后删除其中的一些,并调整其中的一些大小,虚拟磁盘最终是否会被分成多个碎片,这些碎片是否会遍布所有这些硬盘驱动器?
例如:如果 VirtualDisk1 的第一个 1TB 位于 PhysicalDrive4 的开头,而 VirtualDisk1 的第二个 1TB 位于 PhysicalDrive4 的末尾,则 VirtualDisk1 的最后 3TB 在 PhysicalDrive5 上,VirtualDisk2、VirtualDisk3 等。
我想知道这样的碎片会不会导致性能问题,Windows如何处理这种情况以及Windows如何针对这种情况优化存储空间?
我使用oarc 测试测试了我的 dns 服务器,我的大小限制至少为 1403 字节。我在 Juniper ISG 2000 之前执行了相同的测试,结果是 2047 字节。
根据IP “Fragments Filtered”一章和这篇文章,我认为我有一个碎片问题。
这篇文章讨论的ip virtual-reassembly是 cisco,但我找不到 Juniper 的等价物。
在与我的网络管理员讨论这个之前,我更喜欢在 JunOS 中找到好的选择:-)
谢谢
fragmentation ×10
linux ×2
linux-kernel ×2
sql-server ×2
ceph ×1
cisco ×1
defrag ×1
filesystems ×1
juniper ×1
memory ×1
memory-usage ×1
pagefile ×1
performance ×1
raid ×1
redis ×1
storage ×1
swap ×1
tmpfs ×1
udp ×1
windows ×1
xfs ×1