events_transactions_history_long表的内存占用
events_transactions_history_long表用于存储历史的事务信息。通过参数performance_schema_events_transactions_history_long_size来控制最多保留多少条事务记录(包含所有session)
通过操作系统直接查看内存占用来判断events_transactions_history_long表的内存占用不太可行,通过table status来查看也不可行,如下:
Name: events_transactions_history_long
Engine: PERFORMANCE_SCHEMA
Version: 10
Row_format: Dynamic
Rows: 10000
Avg_row_length: 0
Data_length: 0
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
最好的办法还是从源码入手,了解events_transactions_history_long的存储方式。
events_transactions_history_long中存储的信息和events_transactions_current一样,只不过events_transactions_current是线程当前事务的状态。
events_transactions_history_long的数据保存是使用一个环形数组来完成的,如下:
/** EVENTS_TRANSACTIONS_HISTORY_LONG circular buffer. */
PFS_ALIGNED PFS_events_transactions *events_transactions_history_long_array= NULL;
这个数组的大小在系统启动时确定好,不可以动态修改,其中初始化的过程如下:
/**
Initialize table EVENTS_TRANSACTIONS_HISTORY_LONG.
@param events_transactions_history_long_sizing table sizing
*/
int init_events_transactions_history_long(uint events_transactions_history_long_sizing)
{
events_transactions_history_long_size= events_transactions_history_long_sizing;
events_transactions_history_long_full= false;
PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0);
if (events_transactions_history_long_size == 0)
return 0;
events_transactions_history_long_array=
PFS_MALLOC_ARRAY(& builtin_memory_transactions_history_long,
events_transactions_history_long_size,
sizeof(PFS_events_transactions), PFS_events_transactions,
MYF(MY_ZEROFILL));
return (events_transactions_history_long_array ? 0 : 1);
}
通过此函数可以清晰的看出,为了存储历史数据所需要的内存大小,计算得出,每一条记录(PFS_events_transactions)在344个字节,要存储100万记录的话,内存需要300多M。
结构体PFS_events_transactions中虽然包含了部分指针类型的成员,比如它的父类PFS_events中的 const char *m_source_file;
/** Instrument metadata. */
PFS_instr_class *m_class;
/** Location of the instrumentation in the source code (file name). */
const char *m_source_file;
但其实是指向同一块内存区域的,所以可以忽略。
结论就是:
- 存储100万记录的话,内存需要328M。
- 最大设置为1048576,MySQL限制
上一篇: Java多线程之synchronized和lock
下一篇: MySQL中的互斥锁包装器
推荐阅读
-
events_transactions_history_long表的内存占用
-
sqlserver2014从服务器上使用内存表的技巧
-
zabbix通过自定义脚本监控nginx,php-fpm和mysql占用内存数和进程的个数
-
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?,50亿4g
-
成员函数-关于实例化一个类时占用的内存大小问题
-
如何快速杀死占用过多资源(CPU,内存)的数据库进程_MySQL
-
获得php代码使用占用内存的情况_PHP教程
-
10种检测Python程序运行时间、CPU和内存占用的方法
-
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?,50亿4g
-
如何解决Win1021H1内存占用太高 最新电脑内存使用率太高的解决教程