MySQL:一段innodb buffer instance和cleaner线程计算逻辑

计算逻辑位于函数innobase_start_or_create_for_mysql中

        if (srv_buf_pool_instances == srv_buf_pool_instances_default) {
#if defined(_WIN32) && !defined(_WIN64)
            /* Do not allocate too large of a buffer pool on
            Windows 32-bit systems, which can have trouble
            allocating larger single contiguous memory blocks. */
            srv_buf_pool_instances = ut_min(
                static_cast(MAX_BUFFER_POOLS),
                static_cast(srv_buf_pool_size
                           / (128 * 1024 * 1024)));
#else /* defined(_WIN32) && !defined(_WIN64) */
            /* Default to 8 instances when size > 1GB. */
            srv_buf_pool_instances = 8;
#endif /* defined(_WIN32) && !defined(_WIN64) */
        }
    } else {
        /* If buffer pool is less than 1 GiB, assume fewer
        threads. Also use only one buffer pool instance. */
        if (srv_buf_pool_instances != srv_buf_pool_instances_default
            && srv_buf_pool_instances != 1) {
            /* We can't distinguish whether the user has explicitly
            started mysqld with --innodb-buffer-pool-instances=0,
            (srv_buf_pool_instances_default is 0) or has not
            specified that option at all. Thus we have the
            limitation that if the user started with =0, we
            will not emit a warning here, but we should actually
            do so. */
            ib::info()
                << "Adjusting innodb_buffer_pool_instances"
                " from " << srv_buf_pool_instances << " to 1"
                " since innodb_buffer_pool_size is less than "
                << BUF_POOL_SIZE_THRESHOLD / (1024 * 1024)
                << " MiB";
        }
        srv_buf_pool_instances = 1;
    }
    if (srv_buf_pool_chunk_unit * srv_buf_pool_instances
        > srv_buf_pool_size) {
        /* Size unit of buffer pool is larger than srv_buf_pool_size.
        adjust srv_buf_pool_chunk_unit for srv_buf_pool_size. */
        srv_buf_pool_chunk_unit
            = static_cast(srv_buf_pool_size)
              / srv_buf_pool_instances;
        if (srv_buf_pool_size % srv_buf_pool_instances != 0) {
            ++srv_buf_pool_chunk_unit;
        }
    }
    srv_buf_pool_size = buf_pool_size_align(srv_buf_pool_size);
    if (srv_n_page_cleaners > srv_buf_pool_instances) {
        /* limit of page_cleaner parallelizability
        is number of buffer pool instances. */
        srv_n_page_cleaners = srv_buf_pool_instances;
    }
  • 小于1G那么 instance为1,这个时候cleaner线程也是1
请使用浏览器的分享功能分享到微信等