GlusterFS的Linux内核配置

本文的翻译是在“ Administrator Linux。专业“










时不时地出现关于Gluster关于内核调优的建议以及是否需要这样做的问题。



这种需求很少见。内核在大多数工作负载下都表现出色。虽然有缺点。从历史上看,如果有机会,Linux内核会急切地消耗大量内存,包括将缓存作为提高性能的主要方法。



在大多数情况下,这可以正常工作,但在重负载下可能会导致问题。



我们在消耗大量内存的系统(例如CAD,EDA等)上拥有丰富的经验,这些系统在高负载下开始变慢。有时我们会遇到Gluster的问题。在仔细观察了所用的内存和磁盘的延迟超过一天之后,我们得到了它们的过载,巨大的iowait,内核错误(内核oops),冻结等。



本文是在各种情况下执行的许多调整实验的结果。这些参数不仅改善了整体响应能力,而且还显着稳定了群集性能。



在进行内存调优时,首先要看的是虚拟内存(VM)子系统,该子系统具有大量可能使您感到困惑的选项。



vm.swappiness



vm.swappiness与RAM相比, 此参数确定内核使用交换(交换)的数量。在源代码中,它也定义为“窃取映射内存的倾向”(窃取映射内存的倾向)。较高的swappiness值意味着内核将更倾向于卸载渲染的页面。较低的swappiness值表示相反的意思:内核将从内存中交换较少的页面。换句话说,值越高vm.swappiness,系统交换的次数就越多。



交换的大量使用是不可取的,因为将大量数据块加载和卸载到RAM中。许多人会认为交换性值应该很高,但是以我的经验,将其设置为“ 0”会提高性能。



您可以在此处阅读更多详细信息-lwn.net/Articles/100978



但是,同样,应谨慎使用这些设置,并且仅在测试特定应用程序之后才能应用。对于高负载流应用程序,此参数应设置为“ 0”。更改为“ 0”可以改善系统的响应能力。



vm.vfs_cache_pressure



此参数控制内核用于缓存目录对象和索引节点(dentry和inode)的内存消耗。



默认值为100,内核将尝试公平地释放dentry和inode缓存到pagecache和swapcache。减少vfs_cache_pressure会导致内核保留dentry和inode缓存。值为0时,由于内存压力不足,内核将永远不会清除dentry和inode缓存,这很容易导致内存不足错误。将vfs_cache_pressure增加到100以上会导致内核优先考虑dentry和inode卸载。



借助GlusterFS,由于inode / dentry缓存,许多拥有大量数据和许多小文件的用户可以轻松地在服务器上使用大量RAM,这可能导致性能下降,因为内核必须在具有40 GB内存的系统上处理数据结构... 将此参数设置为100以上有助于许多用户获得更公平的缓存并改善了内核响应速度。



vm.dirty_background_ratio和vm.dirty_ratio



第一个参数(vm.dirty_background_ratio)定义了带有脏页的内存百分比,此后有必要启动将脏页后台刷新到磁盘。在达到此百分比之前,不会将任何页面刷新到磁盘。重置开始后,它将在后台运行,而不会中断正在运行的进程。



第二个参数(vm.dirty_ratio)定义了强制闪存开始之前脏页可以占用的内存百分比。当达到此阈值时,所有进程将变为同步(阻塞)并且不允许它们继续运行,直到它们所请求的I / O实际上完成并且数据在磁盘上为止。高I ​​/ O负载会导致问题,因为没有数据缓存并且所有I / O进程都在等待I / O。这导致大量冻结过程,高负载,不稳定的系统操作和较差的性能。



减小这些参数的值会导致以下事实:数据更经常被刷新到磁盘而不存储在RAM中。这可以帮助拥有大量内存的系统,可以刷新45-90 GB的页面缓存,这会导致前端应用程序的巨大延迟,从而降低总体响应能力和交互性。



“ 1”> / proc / sys / vm / pagecache



页面高速缓存是一种用于存储文件和可执行程序的数据的高速缓存,也就是说,这些页面具有文件或块设备的实际内容。此高速缓存用于减少磁盘读取次数。值为“ 1”表示高速缓存使用1%的RAM,并且从磁盘读取的内容将比从RAM读取的内容多。不必更改此参数,但是如果您对控制页面缓存不满意,则可以使用它。



截止日期> / sys /块/ sdc /队列/调度程序



I / O调度程序是处理读取和写入队列的Linux内核组件。从理论上讲,最好将“ noop”用于智能RAID控制器,因为Linux对磁盘的物理几何形状一无所知,因此让对磁盘几何形状有充分了解的控制器尽可能快地处理请求会更有效。但是截止日期似乎可以改善绩效。有关调度程序的更多信息,请参见Linux内核源代码的文档: linux/Documentation/block/*osched.txt而且我还看到混合操作期间(许多写入)的读取吞吐量有所增加。



“ 256”> / sys /块/ sdc /队列/ nr_requests



I / O请求在发送到调度程序之前在缓冲区中的数量。一些控制器的内部队列大小(queue_depth)大于I / O调度程序的nr_requests,因此I / O调度程序几乎没有机会正确地对请求进行优先级划分和合并。对于截止日期和CFQ调度程序,最好将nr_requests设置为控制器内部队列的2倍。组合查询并对其重新排序可帮助计划人员在重负载下提高响应速度。



回声“ 16”> / proc / sys / vm / page-cluster



page-cluster参数控制一次要交换的页面数。在上面的示例中,该值根据RAID的64KB条带大小设置为“ 16”。swappiness = 0时没有意义,但如果将swappiness设置为10或20,则在RAID条带大小为64KB时使用此值将对您有所帮助。



blockdev --setra 4096 / dev / <devname >(-sdb,hdc或dev_mapper)



许多RAID控制器的默认块设备设置通常会导致糟糕的性能。添加以上选项可为4096 * 512字节扇区配置预读。至少对于流操作,通过在内核准备I / O期间用预读填充板载磁盘缓存来提高速度。缓存可以包含下次读取时将请求的数据。如果过多的预读正在使用潜在的有用磁盘时间或将数据加载到缓存之外,则可能会杀死大型文件的随机I / O。



以下是文件系统级别的其他一些准则。但是它们尚未经过测试。确保您的文件系统知道条带大小和阵列中的磁盘数。例如,它是一个raid5阵列,具有64K条带大小,其中包含六个磁盘(实际上是五个,因为一个磁盘用于奇偶校验)。这些建议基于理论假设,并由RAID专家从各种博客/文章中收集。



-> ext4 fs, 5 disks, 64K stripe, units in 4K blocks
mkfs -text4 -E stride=\$((64/4))
-> xfs, 5 disks, 64K stripe, units in 512-byte sectors
mkfs -txfs -d sunit=\$((64*2)) -d swidth=\$((5*64*2))


对于大文件,请考虑增加上述条带大小。



注意!上述所有内容对于某些类型的应用程序都是非常主观的。如果未事先对各个应用程序进行用户测试,则本文不保证任何改进。仅在有必要提高系统的整体响应能力或解决当前问题时才应使用它。



其他材料:









阅读更多






All Articles