j2_inodeCacheSize调优操纵和内存DR操纵的潜匿伤害副浸染
副标题[/!--empirenews.page--]
简介大小适中的增强日志文件系统 (JFS2) inode 缓存对实现 IBM AIX 系统的高性能和稳定性至关重要。通常用户会通过调优 j2_inodeCacheSize 来控制 inode 缓存的最大内存使用。inode 缓存大小也可通过内存动态重新配置 (DR) 操作进行更改。在 AIX 6.1(6100-04 以上)和 AIX 7.1 中,有一种隐藏的副作用,在执行 j2_inodeCacheSize 调优操作或动态逻辑分区 (DLPAR) 内存操作之后,inode 缓存类的最大堆大小只能下调。在本文中,我们将演示这种副作用是如何导致 inode 缓存耗尽的,还会介绍一些处理这类问题的方法。 JFS2 inode 缓存inode 是 JFS2 的基础结构。每个 inode 拥有一个磁盘上 512 字节 的数据结构。当 inode 在内存中工作时,JFS2 跟踪的不仅仅是磁盘上的字段。核内 inode(包括磁盘上部分和工作部分)目前大约为 1 KB。AIX 内核会缓存所有这些数据来提高性能。 为了预防多个处理器争用,inode 缓存拆分为多个缓存类。AIX 内核为每个处理器创建了两个缓存类,还创建了另外一个缓存类,也就是说,在系统初始化时会创建总计 [n(处理器数)* 2 + 1] 个缓存类。iCacheClass 和 iCache 结构是在 /usr/include/j2/j2_inode.h 中定义的: typedef struct iCacheClass { MUTEXLOCK_T cc_lock; int32 cc_nInode; /* # of inode in cacheList */ CDLL_HEADER(inode) cc_cacheList; /* cacheList header */ struct pile *cc_pile; /* inode pile */ boolean_t pileFull; /* pile is full */ } iCacheClass_t; struct iCache { int32 nInode; /* # of in-memory inode */ int16 nCacheClass; /* # of cacheClass */ struct iCacheClass *cacheTable; int32 nInodePerCacheClass; /* # of inode per cacheClass */ int32 nHashClass; /* # of hashClass - 1 */ int32 nNewHashClass; /* # of hashClass - 1 */ int32 nInodePerHashClass; /* # of inode per hashClass */ struct iHashClass **hashTable; int32 nPagesPerCacheClass; /* # of pile pages per cacheClass */ int32 nMaxInode; /* nInode at initialization time */ }; 为每个缓存类提供了一个用于 inode 分配的堆: struct pile { eye_catch_t pile_eyec; /* 8: pile eye-catcher */ uint32_t flags; /* 4: guarded by pile_lock */ uint16_t obj_size; /* 2: opaque object size */ uint16_t align; /* 2: object align (offset mask) */ uint16_t slab_size; /* 2: alloc slab size in pages */ ...... uint64_t max_total_pages; /* 8: max total pages, ideally */ uint64_t min_total_pages; uint64_t cur_total_pages; /* 8: real world value */ ...... }; 可为一个堆配置最大页数。这个 max_total_pages 字段确定分配多少个 inode 才能将一个堆装满,并开始从缓存列表回收 inode。可强制性缩小堆,,也可以扩大它。此过程在内存 DR 和 j2_inodeCacheSize 调节期间执行。 调节 j2_inodeCacheSize inode 缓存大小可通过使用 ioo 命令更改 j2_inodeCacheSize tunable 来调节。在 AIX 6.1 中,该值默认为 400,在 AIX 7.1 中默认为 200。该值没有明确表明将使用的缓存量,而只是一个缩放比例系数。它可与主要内存的大小结合使用,以确定 inode 缓存的最大内存使用量。目前的公式为: (inode 缓存内存)=(系统内存)*(j2_inodeCacheSize)/4000 我们可运行以下命令来显示 j2_inodeCacheSize 的当前值: #ioo -a |grep j2_inodeCacheSize 可使用 kdb 命令获取 inode 缓存的详细信息: (0)> i2 -c iCache: nInode: 0xB3306 (733958) nMaxInode: 0xB3306 (733958) nCacheClass: 17 nHashClass: 0xFFFF (65535) nNewHashClass: 0xFFFF (65535) cacheTable: 0xF10001003B4FC000 hashTable: 0xF10001003B54B000 Cache table: CLASS LOCK INODES CACHELIST.HEAD PILE FULL 0 0 260 F10001003FD92080 F10001003B502300 0 1 0 273 F10001003D4A2880 F10001003B502600 0 …… 16 0 260 F10001003FF17880 F10001003B503400 0 (0)> dw iCache 12 iCache+000000: 000B3306 00110000 F1000100 3B4FC000 ..3.........;O.. iCache+000010: 0000A8A6 0000FFFF 0000FFFF 00000010 ................ iCache+000020: F1000100 3B54B000 000029D5 000B3306 ....;T....)...3. (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |