关于gfs超时问题总结

1.glusterfscup占用率过高

    高峰期glusterfs的cpu占用率达到280%(top指令查看),并且通过验证在cpu高的时候就会有超时出现;

  首先判断是sys还是usr比较占cpu,通过dstat查看是系统比较占cpu(mpstat也可以查看),这说明是内核态有过多的操作,问题在内核不在glusterfs代码本身;

   通过perf指令查询,发现_spin_lock_irq这个内核函数占用时间较长,例子如下(具体参见perf_result_glusterfsd_128136.txt文档):

[root@bj-nx-cip-w87 ~]# perf record  -g -p 128136(glusterfs进程对应IP)

^C[ perf record: Woken up 28 times to write data ]

[ perf record: Captured and wrote 7.178 MB perf.data (~313619samples) ]

[root@bj-nx-cip-w87 ~]# perf report --stdio

# Events: 47K cycles

#

# Overhead    Command          Shared Object                                  Symbol

# ........  .........  .....................  ......................................

#

    91.51%  glusterfs [kernel.kallsyms]      [k]_spin_lock_irq

            |

            --- _spin_lock_irq

               |         

               |--99.64%--compact_zone

               |          compact_zone_order

               |          try_to_compact_pages

               |          __alloc_pages_nodemask

               |          alloc_pages_vma

               |          do_huge_pmd_anonymous_page

               |          handle_mm_fault

               |          __do_page_fault

               |          do_page_fault

               |          page_fault

               |          |         

               |          |--94.45%-- xdr_callmsg_internal

               |          |          0x3829b98860

               |          |         

               |           --5.55%-- __memcpy_sse2

                --0.36%--[...]

在_spin_lock_irq这个内核函数里compact_zone这个函数花费时间最长

 查看网络相关资料:http://blog.youkuaiyun.com/lin_fs/article/details/9146971

 内存碎片整合的时候耗费了大量cup的时间;文章里面提到了THP(即Transparenthugepages)

 搜索Transparenthugepages相关内容得文章:http://blog.youkuaiyun.com/lin_fs/article/details/9146213

正好符合我们当时线上的情况;

执行指令:echo never >/sys/kernel/mm/redhat_transparent_hugepage/defrag

Cpu有所下降;

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled  这个写到/etc/rc.local  防止其开机后失效;

关于TransparentHugepage的相关资料:http://blog.youkuaiyun.com/lin_fs/article/details/9146273

 

2.压力下Glusterfscpu占用过高和xdr_callmsg (&xdr, request)这个函数耗时的关系

     Xdr_callmsg不是内核函数而是libc里面的一个函数,在这个函数里面申请了内存(参见rpc_callmsg.c)触发了Transparent Hugepage进行碎片整理,所以导致glusterfs的cpu占用过高;(为什么会触发Transparent Hugepage?Transparent Hugepage有什么作用)

总结:

1.压力过大只是一个表象,任何系统都是可以优化的;

2.找到根本性原因才能找到根本性的措施

3.相关定位问题工具:dstat, mpstat, perf, strace, pstack

3.后期的维护

     一个分布式文件系统的性能问题,往往会受到这个文件系统所在的服务器的本地文件系统(ext4)和内核(CnetOS)的一些bug的影响。调整好好这些参数,对这个集群的性能都会有很大的改善。

    后期维护参考资料:http://blog.youkuaiyun.com/peter_cloud/article/details/9139111

<think>嗯,用户这次想了解Linux 5.10内核中gfs_init函数的详细信息。从对话历史看,用户之前提到过GFS2文件系统的文档引用,但明确指出这仅供参考,实际需求是函数级别的技术细节。 用户可能是内核开发者或文件系统研究员,需要深入理解GFS2模块的初始化逻辑。这类需求通常涉及源码分析、函数调用链和初始化流程。考虑到Linux内核的复杂性,我需要从多个维度组织信息: 首先想到的是代码定位。gfs_init函数应该属于GFS2模块,在5.10内核中可能位于fs/gfs2/目录下的某个文件。通过内核源码交叉引用,最可能的文件是super.c或ops_fstype.c,因为模块初始化函数通常放在文件系统的主实现文件中。 关于函数功能,GFS2作为集群文件系统,初始化必然涉及几个关键步骤:注册文件系统类型、初始化全局锁管理、准备内存缓存等。特别要注意DLM(分布式锁管理器)的集成,这是GFS2的核心特性。用户可能关心锁处理机制如何在内核启动时初始化。 参数设计值得说明。虽然该函数是静态初始化函数,但需要关注其依赖的__init宏和模块初始化机制。Linux内核的模块加载有特定生命周期,gfs_init应该会在系统启动或模块加载时被调用一次。 调用关系方面,它应该通过module_init宏注册到内核。这里需要强调debugfs的创建流程,因为调试接口对开发者很重要。错误处理机制也不能忽略,特别是初始化失败时的回滚操作。 用户可能还想知道如何验证这些信息。建议直接查看源码永远是最可靠的方式,特别是当文档可能滞后时。可以推荐LXR或Elixir这类在线代码浏览工具,方便快速定位。 相关问题需要延伸思考:用户后续可能会问性能调优(如增加journal数量)、故障处理(初始化失败日志分析)、或者动态调试方法。同步机制相关问题也很有价值,因为集群文件系统的同步逻辑总是难点。 </think>在Linux 5.10内核中,`gfs_init()`函数是**GFS2文件系统模块的初始化入口**,其主要功能是注册GFS2文件系统类型并完成关键数据结构的初始化。核心实现位于内核源码的以下路径: ### 关键实现位置 ```bash fs/gfs2/ops_fstype.c # 主要实现文件 fs/gfs2/super.c # 相关辅助函数 ``` --- ### 核心功能解析(基于Linux 5.10源码) 1. **文件系统注册** ```c static struct file_system_type gfs2_fs_type = { .owner = THIS_MODULE, .name = "gfs2", .mount = gfs2_mount, .kill_sb = gfs2_kill_sb, .fs_flags = FS_REQUIRES_DEV, }; static int __init gfs_init(void) { int error = register_filesystem(&gfs2_fs_type); // 注册GFS2类型 ... } ``` 通过`register_filesystem()`向VFS注册GFS2,使系统能识别`mount -t gfs2`命令[^1]。 2. **全局锁初始化** ```c error = gfs2_glock_init(); if (error) goto fail; ``` 初始化GFS2的分布式锁管理器(GLOCK),这是实现集群一致性的核心组件[^1]。 3. **调试接口创建** ```c gfs2_create_debugfs(); // 在/sys/kernel/debug/gfs2/生成调试节点 ``` 提供运行时状态监控接口,如glock状态、事务日志等。 4. **内存缓存初始化** ```c error = gfs2_qd_shrinker_init(); error = gfs2_register_shrinker(); ``` 为配额数据(quota)和glock等结构初始化SLAB缓存,优化内存分配效率。 --- ### 初始化流程异常处理 函数包含完善的错误回滚机制: ```c fail_unregister: unregister_filesystem(&gfs2_fs_type); fail: gfs2_glock_exit(); gfs2_delete_debugfs(); return error; ``` 当任一子步骤失败时,会逆向释放已分配的资源,避免内核模块加载泄漏。 --- ### 技术要点总结 1. **调用时机**:在内核启动时通过`module_init(gfs_init)`自动加载,或通过`insmod gfs2.ko`手动加载。 2. **关键依赖**:需先加载底层集群通信层(如DLM锁管理器)。 3. **调试支持**:通过`CONFIG_GFS2_DEBUG`编译选项可开启详细日志。 4. **卸载逻辑**:配套函数`gfs_exit()`负责注销文件系统类型并释放资源。 > 📌 **验证建议**:直接查阅Linux 5.10源码 > ```bash > git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git -b linux-5.10.y > grep -rn 'gfs_init' fs/gfs2/ > ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值