加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

j2_inodeCacheSize调优操作和内存DR操作的隐藏危险副作用

发布时间:2016-08-01 16:53:36 所属栏目:Unix 来源:站长网
导读:简介 大小适中的增强日志文件系统 (JFS2) inode 缓存对实现 IBM AIX 系统的高性能和稳定性至关重要。通常用户会通过调优 j2_inodeCacheSize 来控制 inode 缓存
副标题[/!--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
j2_inodeCacheSize = 400

可使用 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.

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读