缓存管理
有关概述,请参阅持久数据库I/O页面。
正如在优先缓存页面中所解释的,SmartEDB提供了许多C API函数来监视和管理运行时缓存。
缓存优先级
应用程序可以通过分配缓存优先级数据库对象来影响某些页面在内存中保留的时间。这可以通过在传递给mco_db_open_dev()
函数的db_params
中设置以下参数来实现:对于索引indexx_caching_priority
,对于内存分配器位图页面allocation_bitmap_priority,对于数据对象页面(不包括blob) object_caching_priority
。默认值为0表示所有对象的缓存优先级相同。但是可以指定大于零的整数值;该值越高,索引、分配位图或对象页在缓存中保留的时间越长。
使用预设的对象优先级作为基准,可以调用生成的函数 _set_caching_priority()
来调整特定类的相对优先级。例如,大的和很少被访问的对象可以被分配较低的优先级,而小的经常被访问的类可以被分配较高的优先级。在运行时分配的缓存优先级存储在数据库中,直到显式覆盖为止一直使用。
其他可能影响整体性能的内存初始化因素是为缓存和disk_max_database_size
指定的大小。下面几节将对此进行解释。
缓存大小
缓存的内存地址和大小在传递给mco_db_open_dev()
函数的设备参数devs
中指定。内存可以是共享内存,也可以是本地内存。(如果两个或多个进程要共享数据库,则必须是共享内存。)一般来说,较大的缓存将提高应用程序性能,但是对持久介质的更新频率(刷新缓存页面)对性能更为重要。如何将数据库更新写入持久介质由事务提交策略决定。
最大数据库大小
SmartEDB运行时使用传递给mco_db_params_t参数的disk_max_database_size
元素的值来分配“脏页面位图”。
位图是在创建缓存时在缓存中分配的。位图大小可以大致计算为:
disk_max_database_size / page_size / 8.
应用程序可以设置disk_max_database_size = MCO_INFINITE_DATABASE_SIZE
,表示数据库的最大大小未知。在这种情况下,位图的大小被设置为缓存大小的1/16。
运行时也可以配置“可扩展位图”选项,允许无限的数据库大小。如果运行时配置了可扩展的位图,则指定disk_max_database_size = MCO_INFINITE_DATABASE_SIZE
,在这种情况下,位图在SmartEDB堆空间中分配。
预留页面池
如优先缓存页中所述,数据库运行时提供了页池保留机制,该机制有助于缓存的内存不足错误处理。预留池的大小由运行时根据mco_db_params
的值在内部计算。Max_active_pages
参数(默认值为32)和当前到数据库运行时的活动连接数。
可以通过在数据库mco_db_params 中设置mode_mask=MCO_DB_DISABLE_PAGE_POOL_RESERVE
位来禁用该机制。
连接缓存
提供了两个函数mco_disk_enable_connection_cache()
和mco_disk_reset_connection_cache()
,允许应用程序控制连接缓存。默认情况下,连接缓存是启用的。
mco_bool mco_disk_enable_connection_cache(
mco_db_h con,
mco_bool enabled // 通过MCO_YES或MCO_NO来启用或禁用缓存
);
/* 将连接缓存(重置)提交给数据库 */
MCO_RET mco_disk_reset_connection_cache(
mco_db_h con
);
这两个函数处理具有许多连接和长时间事务的场景。在此场景中,连接缓存可能导致页面池耗尽空闲页面(新事务分配自己的连接缓存,但长事务会阻止这些页面被释放回共享页面池)。要解决这个问题,可以经常关闭或重置连接缓存。在正常情况下,应用程序不需要控制连接缓存。
内存中页面分配
在MVCC模式下,每连接分配器持有的最小和最大页面数由mco_db_open_dev()
的mco_db_params_t 参数中的数据库参数min_conn_local_pages
和max_conn_local_pages
决定。MVCC事务管理器通过一次预分配多个页面并将这些页面分配给连接来优化对共享内存池的访问。min_conn_local_pages
的默认值是256,max_conn_local_pages
的默认值是512。
最小/最大值分配表示更频繁地访问共享资源和分配额外内存之间的权衡。如果应用程序中有定义良好的对象分配和回收模式,那么更改这些默认值可能是有效的。
获取运行时缓存统计信息
mco_disk_get_cache_info()
函数允许应用程序获取运行时磁盘管理器缓存统计信息,包括缓存命中和缓存未命中。当数据库运行时所需的地址或数据在缓存中找到并且不需要从存储介质中检索时,就会发生缓存命中。
例如,这些信息可用于微调应用程序的缓存策略(请参阅优先缓存页面)。
保存和加载缓存
mco_disk_save_cache()
函数允许应用程序将磁盘管理器缓存保存到持久存储;可以调用mco_disk_load_cache()
来加载以前保存的缓存图像。