关于NAS你必须知道的坑

本文涉及的产品
文件存储 NAS,50GB 3个月
简介: 小小的备份为何老是将数据库主机打挂

NFS和脏页

问题

拥有大量 RAM 和大量处理能力的计算机可以在 RAM 中快速创建出许多的脏页(最终会被写入文件系统的数据)。当需要将这些脏页刷新到对应的文件系统(称为回写Writeback)时,NFS 可能会出现很多阻塞。 通过网络传输的数据吞吐量比写入 RAM 要小得多。试想一下,如果拥有10条车道的道路突然减少到2条车道会对道路交通带来何种影响。

人们可能认为这只会影响 NFS 的挂载,但是,允许的脏页数量是一个系统范围级的值。一旦达到此阈值,系统上的每个进程在尝试分配内存时都要去释放页面。如果只有几个脏页,那还好,但是如果有40GB的脏页,那么所有进程都会被阻塞很长时间。

处理方式

有多种方法可以解决此问题。它们的范围从仅影响进程和正在写入的文件,一直到影响所有进程和所有文件系统。

文件级别的影响

Direct I/O

打开文件进行写入时,使用 O_DIRECT 标志以完全绕过 Page Cache。这也可以通过使用 dd 和带有 oflag=direct 的选项将文件复制到 NFS 来实现。

消减 I/O

下一个选项是限制读取数据的速率以匹配 NFS 的写入速率。例如 使用 rsync 和选项 --bwlimit。

更加频繁的刷写脏页

如果有权重新编译源代码,请定期调用 fsync()。如果无法重新编译源代码,请定期运行以下命令:

ls -l /nfsmount/dir_containing_files

写入较小的文件

如果可能,请尝试将单个大文件分解为多个较小的文件。与每个文件相关联的脏页在关闭时会被刷出。这会导致刷新脏页的频率变大。

NFS挂载的影响

只使用同步IO

通常情况下,每个 I/O 在 NFS 客户端上异步地完成,这意味着应用写入到Page cache,然后 NFS 客户端延迟将数据发送到 NFS 服务器。每个 I/O 可以强制同步完成,这意味着在 NFS 客户端将数据发送到 NFS 服务器并且 NFS 服务器已确认接收数据之前,应用程序不会认为写入完成。在 NFS 客户端挂载时指定sync选项会强制所有写入都同步完成。但是,它也会严重降低 NFS 客户端的写入性能。

rsize/wsize (NFS客户端挂载项)

rsize/wsize 是每次网络读/写请求的最大字节数。根据工作负载类型和网络性能,增加这些值有可能增加吞吐量。默认的 rsize/wsize 由 NFS 客户端与 NFS 服务器协商。 如果工作负载是流式读取/写入的工作负载,将 rsize/wsize 增加到 1048576 (1MiB) 可以提高吞吐量性能。

操作系统级的影响

限制系统范围脏页的数量

从 RHEL 5.6(kernel 2.6.18-238)开始(包括 RHEL 6.0),可以调整参数 vm.dirty_background_bytes 和 vm.dirty_bytes。这些可调参数可提供更精细的粒度调整,尤其是在系统含有大量 RAM 的情况下。在 RHEL 5.6 之前,参数 vm.dirty_background_ratio 和 vm.dirty_ratio 可用于实现相同的目标。

  1. 将 vm.dirty_expire_centisecs (/proc/sys/vm/dirty_expire_centisecs) 从默认值 3000 调整为 500
  2. 将 vm.dirty_background_bytes (/proc/sys/vm/dirty_background_bytes) 限制为 500MiB
  3. 将 vm.dirty_bytes (/proc/sys/vm/dirty_bytes) 限制为不超过 1 GiB

确保 /proc/sys/vm/dirty_background_bytes 始终是比 /proc/sys/vm/dirty_bytes 更小的一个非零值。更改这些值会对吞吐量产生负面影响,同时提高延迟。要改变吞吐量和延迟之间的平衡,请稍微调整这些值并度量其影响,特别是dirty_bytes.

可以通过以下命令来观察脏页和回写的行为:

$ watch -d -n 1 cat /proc/meminfo

文档/sysctl/vm.txt:

dirty_expire_centisecs

This tunable is used to define when dirty data is old enough to be eligible
for writeout by the kernel flusher threads.  It is expressed in 100'ths
of a second.  Data which has been dirty in-memory for longer than this
interval will be written out next time a flusher thread wakes up.

dirty_bytes

Contains the amount of dirty memory at which a process generating disk writes
will itself start writeback.

Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be
specified at a time. When one sysctl is written it is immediately taken into
account to evaluate the dirty memory limits and the other appears as 0 when
read.

Note: the minimum value allowed for dirty_bytes is two pages (in bytes); any
value lower than this limit will be ignored and the old configuration will be
retained.

dirty_ratio

Contains, as a percentage of total available memory that contains free pages
and reclaimable pages, the number of pages at which a process which is
generating disk writes will itself start writing out dirty data.

The total available memory is not equal to total system memory.

dirty_background_bytes

Contains the amount of dirty memory at which the background kernel
flusher threads will start writeback.

Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only
one of them may be specified at a time. When one sysctl is written it is
immediately taken into account to evaluate the dirty memory limits and the
other appears as 0 when read.

dirty_background_ratio

Contains, as a percentage of total available memory that contains free pages
and reclaimable pages, the number of pages at which the background kernel
flusher threads will start writing out dirty data.

The total available memory is not equal to total system memory.

Environment-wide impact

提高网络性能(iperf 基准测试)

网络性能的好坏对 NFS 有着重大影响。通过运行 iperf 检查网络是否运行良好。它可用于测量 NFS 客户端和另一个系统之间的网络吞吐量,比如 NFS 服务器。

接收端:

$ iperf -s -f M

发送端:

$ iperf -c RECEIVER-IP -f M -t 60

进行几次迭代并尝试使每个测试运行至少 60 秒。同时还应该了解基线网络吞吐量。NFS 的执行速度不会比基线快。

小结

整理(翻译)此篇的缘由是,线上碰到了好几次由于备份导致的主机夯死案例,原因有三:

  1. 调大了segsize,PostgreSQL默认是1G,意味着单个文件更大了,Dirty Pages associated with each file will be flushed when it is closed. ,而越大的文件其所占的脏页只有被flush后才会释放,所以这也是拆分为多个小文件的原因
  2. 很多个上TB的大库,同时进行备份,没有错开,进一步加剧了内存压力
  3. swappness设置为了0,在kernel 3.5-rc1以后的版本,swappiness如果等于0的话,哪怕匿名页占据的内存很大,swap分区还有很多的剩余空间,除非恶劣情况发生,都不会交换匿名页

后续使用dd进行实测,开多个进程进行dd往NAS写入,同时NAS采用默认的异步模式,能够稳定复现,将主机打死。

所以,我们可以:

  1. 调整NAS的挂载方式,指定async/sync,正如前文所述,对于异步挂载,客户端下发的写数据会先缓存在内存中,达到一定大小或者其他条件,再一起发往服务端。而同步挂载,每次下发的写数据马上发到服务端,当然代价是吞吐量变低。
  2. 在同城或者备库做备份,非exclusive的备份的是可以在备机做的
  3. 调整page cache的写出策略,linux默认值都太保守了
  4. scale up,提升网络IO性能
  5. 定期监控NAS的脏页数量
  6. ...
相关实践学习
函数计算部署PuLID for FLUX人像写真实现智能换颜效果
只需一张图片,生成程序员专属写真!本次实验在函数计算中内置PuLID for FLUX,您可以通过函数计算+Serverless应用中心一键部署Flux模型,快速体验超写实图像生成的魅力。
目录
相关文章
|
运维 Dubbo Java
对于使用Next.js建站
【1月更文挑战第18天】【1月更文挑战第88篇】对于使用Next.js建站
204 1
|
存储 算法 测试技术
大模型落地的必经之路 | GPTQ加速LLM落地,让Transformer量化落地不再困难
大模型落地的必经之路 | GPTQ加速LLM落地,让Transformer量化落地不再困难
436 0
|
分布式计算 Hadoop Java
hadoop伪分布式搭建(超详细)
hadoop伪分布式搭建(超详细)
1801 0
|
Linux
nfs client高性能参数设置
linux kernel中sunrpc的实现是单连接和长链接的,为了提高并发性能,在单连接的基础上提供多个slot,通过tcp_slot_table_entries参数设置。slot个数越多,nfs请求并发处理能力越强,如果slot个数很小,而nfs请求又很多,就会在client排队等待。
9106 0
|
3月前
|
安全 网络安全 数据安全/隐私保护
DirectX修复工具增强版,免费的dll修复工具,dll下载,DirectX修复工具下载
DirectX修复工具是一款系统级工具软件,支持Windows XP至Windows 11多个操作系统版本,兼容32位和64位系统。程序可自动调整任务模式,无需用户设置,操作简便,点击即可修复DirectX问题。增强版还支持修复C++运行库问题,提供在线修复版和标准版多种选择。遇到如英雄联盟game_error_directx错误或0xc000007b问题时,使用该工具可有效解决。程序具备扩展功能,可通过下载数据包升级为增强版,并提供详细错误提示与修复方案,适用于多种DirectX及C++异常情况。
323 4
|
SQL DataWorks 监控
DataWorks产品使用合集之怎么针对表中已经存在的数据进行更新
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
DataWorks产品使用合集之怎么针对表中已经存在的数据进行更新
|
10月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
弹性计算 安全 虚拟化
万字干货分享 | 阿里云CIPU技术解析
2022年6月,阿里云发布了云基础设施处理器CIPU(Cloud  Infrastructure Processing  Unit),将其定义为取代传统CPU的新一代云计算体系架构的核心。在这个全新体系架构下,CIPU向下对数据中心计算、存储、网络等底层基础设施快速云化并进行硬件加速,向上接入飞天云操作系统,将全球数百万台服务器构建为一台超级计算机,实现资源的灵活编排和调度,给用户提供高质量弹性云计算算力集群。
万字干货分享 | 阿里云CIPU技术解析
|
Linux Shell Perl
Linux环境下的字符串处理:基础到高级
在Linux系统中,字符串处理是一个非常常见的任务,无论是在系统管理、文本处理还是脚本编程中。本文将从基础的字符串操作开始,逐步深入,介绍Linux下的字符串处理技术,包括基础的命令行操作、常见的文本处理工具、Shell脚本中的字符串操作等。
496 1
|
弹性计算 关系型数据库 Apache
手把手教你使用阿里云服务器搭建个人博客
这是我第一次搭建个人博客网站,总体上来说还是非常顺利的,主要四个步骤,首先创建阿里云服务器,其次创建云数据库实例,再次阿里云服务器链接云数据库,最后安装WordPress。四步轻松就可以搭建个人博客网站啦,之前搭建博客起码需要一两周的时间,这次建站只花费了我1个小时就完成啦。
3989 12