关闭
当前位置:首页 - 音乐世界 - 正文

毓怎么读,技能共享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,复杂的生活,争议的情绪

admin 2019-12-22 153°c

作者:高鹏

文章结尾有他作品的《深化了解 MySQL 主从原理 32 讲》,深化透彻了解 MySQL 主从,GTID 相关技术知识。

本文为学习记载,或许有误请谅解。

本文主张PC端观看,效果更佳。

这个问题是一个朋友遇到的@风云,而且这位朋友现已得出了近乎藤兰正确的判别,下面进行一些描绘。

一、问题展现

下面是问题其时的体系负载如下:

咱们能够看到 40.4%sy 正是体系调用负载较高的体现,随即朋友采集了 perf 如下:

接下来朋友采集了 pstack 给我,我发现很多的线程处于如下状态下:

Thread 38 (Thread 0x7fe57a86f700 (LWP 67268)):#0 0x0000003dee4f82ce in __lll_lock_wait_private () from /lib64/libc.so.6#1 0x0000003dee49df8d in _L_lo毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情ck_2163 () from /lib64/libc.so.6#2 0x0000003dee49dd47 in __tz_convert () from /lib64/libc.so.6#3 0x00000000007c02e7 in Time_zone_system::gmt_sec_to_TIME(st_mysql_time*, lo嗓子痒咳嗽ng) const ()#4 0x0000000000811df6 in Field_timestampf::get_date_internal(st_mysql_time*) ()#5 0x0000000000809ea9 in Field_temporal_with_date::val_date_temporal() ()#6 0x00000000005f43cc in get_datetime_value(THD*, Item***, Item**, Item*, bool*) ()#7 0x00000000005e7ba7 in Arg_comparator::compare_datetime() ()#8 0x00000000005eef4e in Item_func_gt::val_int() ()#9 0x00000000006fc6ab in evaluate_join_record(JOIN*, st_join_table*) ()#10 0x0000000000700e7e in sub_select(JOIN*, st_join_table*, bool) ()#11 0x00000000006fecc1 in JOIN::exec() ()

咱们能够留意一下 __tz_convert 这正是时区转化的依据。

二、关于 timestamp 扼要阐明

timestamp:占用 4 字节,内部完成是新纪元时刻(1970-01-01 00:00:00)以来的秒,那么这种格局在展现给用户的时分就需求做必要的时区转化才干得到正确数据。下面咱们经过拜访 ibd 文件来检查一下内部表明办法,运用到了我的两个东西 innodb 和 bcview。

具体参阅:https://www.jianshu.com/p/719f1bbb21e8。

timestamp 的内部表明

树立一个测试表

mysql> show variabl灌云天气预报es like '%time_zone%';+------------------+--------+| Variable_name | Value |+------------------+--------+| system_time_zone | CST || time_zone | +08:00 |+------------------+--------+
mysql> crea毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情te table tmm(dt timestamp);Query OK, 0 rows affected (0.04 sec)
mysql> insert into tmm values('2019-01-01 01:01:01');Query OK, 1 row affected (0.00 sec)

咱们来检查一下内部表明如下:

[root@gp1 test]# ./bcview tmm.ibd 16 125 25|grep 00000003current block:00000003--Offset:00125--cnt bytes:25--data is:000001ac3502000000070d52c80000002f01105c2a4b4d0000

收拾一下如下:

  • 000001ac3502:rowid
  • 000000070d52:trx id
  • c80000002f0110:roll ptr
  • 5c2a4b4d:timestamp 类型的实践数据十进制为 1546275661

咱们运用 Linux 指令如下:

[root@gp1 ~]# date -d @1546275661Tue Jan 1 01:01:01 CST 2019

由于我的 Linux 也是 CST +8 时区这儿数据也和 MySQL 中显现相同。下面咱们调整一下时区再来看看取值如下:

mysql> set time_zone='+06:00';Query OK, 0 rows affected (0.00 sec)
mysql> select * from tmm;+---------------------+| dt |+---------------------+| 2018-12-31 23:01:01 |+---------------------+1 row in set (0.01 sec)

这儿能够看到减去了 2 个小时,由于我的时区从 +8 变为了 +6。

三、timestamp 转化

在进行新纪元时刻(1970-01-01 00:00:00)以来的秒到实践时刻之间转化的时分 MySQL 依据参数 time_zone 的设置有两种挑选:

  • time_zone 设置为 SYSTEM 的话:运用 sys_time_zone 获取的 OS 会话时区,一起运用 OS API 进行转化。对应转化函数 Time_functionzone_system::gmt_sec_to_TIME
  • time_zone 设置为实践的时区的话:比方 ‘+08:00’,那么运用运用 MySQL 自己的办法进行转化。对应转化函数 Time_zone_offset::gmt_sec_to_TIME

实践上 Time_zone_system 和 Time_zone_offset 均承继于 Time_zone 类,而且完成了 Time_zone 类的虚福克斯rs函数进行了重写,因而上层调用都是 Time_zone::gmt_sec_to_TIME。

留意这种转化操作是每行契合条件的数据都需求转化的。

四、问题修正计划

咱们从问题栈帧来看这个毛病运用的是 Time_zone_system::gmt_sec_to_TIME 函数进行转able换的,因而能够考虑如下:

  • time_zone:设置为指定的时区,比方 ‘+08:00’。这样就不会运用 OS API 进行转化了,而转为 MySQL 自己的内部完成 调用 Time_zone_offset::gmt_sec_to_TI毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情ME 函数。可是需求留意的是,假如运用 MySQL 自己的完成那么 us% 会加重。
  • 运用 datetime 替代 timestamp,新版本 datetime 为 5 个字节,只比 timestamp 多一个字节。

五、修正前后

sy% 运用量比照 据朋友说他大概在上午 11 点多完成了修正,做的方法是将 time_zone 修正为 ‘+08:00’,下面展现修正前后 CPU 运用率的比照:

修正前:

修正后:

六、备用栈帧

  • time_zone=‘SYSTEM’转化栈帧
#0 Time_zone_system::gmt_sec_to_TIME (this=0x2e76948, tmp=0x7fffec0f3ff0, t=1546275661) at /root/mysqlall/percona-server-溺爱皇室宠公主locks-detail-5.7.22/sql/tztime.cc:1092#1 0x0000000000f6b65c in Time_zone::gmt_sec_to_TIME (this=0x2e76948, tmp=0x7fffec0f3ff0, tv=...) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/tztime.h:60#2 0x0000000000f51643 in Field_timestampf::get_date_internal (this=0x7ffe7ca66540, ltime=0x7fffec0f3ff0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.cc:6014#3 0x0000000000f4ff49 in Field_temporal_with_date::val_str (this=0x7ffe7ca66540, val_buffer=0x7fffec0f4370, val_ptr=0x7fffec0f4370) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.cc:5429#4 0x0000000000f11d7b in Field::val_str (this=0x7ffe7ca66540, str=0x7fffec0f4370) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.h:866#5 0x0000000000f4549d in Field::send_text (this=0x7ffe7ca66540, protocol=0x7ffe7c001e88) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.cc:1725#6 0红色警戒2x00000000014dfb82 in Protocol_text::store (this=0x7ffe7c001e88, field=0x7ffe7ca66540) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/protocol_classic.cc:1415#7 0x0000000000fb06c0 in Item_field::send (this=0x7ffe7c006ec0, protocol=0x7ffe7c001e88, buffer=0x7fffec0f4760) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/item.cc:7801#8 0x000000000156b15c in THD::send_result_set_row (this=0x7ffe7c000b70, row_items=0x7ffe7c005d58) at /root/mysqlall回族为什么不吃猪肉/percona-server-locks-detai红豆薏米l-5.7.22/sql/sql_class.cc:5026#9 0x0000000001565758 in Query_result_send::send_data (this=0x7ffe7c006e98, items=...) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.cc:2932花海#10 0x0000000001585490 in end_send (join=0x7ffe7c007078, qep_tab=0x7ffe7c0078d0, end_of_records=false) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:2925#11 0x0000000001582059 in evaluate_join_record (join=0x7ffe7c007078, qep_tab=0x7ffe7c00775毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情8)
  • time_zone=‘+08:00’转化栈帧
#0 Time_zone_offset::gmt_sec_to_TIME (this=0x6723d90, tmp=0x7fffec0f3ff0, t=1546275661) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/tztime.信宜飘流cc:1418#1 0x0000000000f6b65c in Time_zone::gmt_sec_to_TIME (this=0x6723d90, 赵郁鑫相片tmp=0x7fffec0f3ff0, tv=...) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/tztime.h:60#2 0x0000000000f51643 in Field_timestampf::get_date_internal (this=0x7ffe7ca66540, ltime=0x7fffec0f3ff0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.cc:6014#3 0x0000000000f4ff49 in Field_temporal姚庆德_with_date::v一夜惊喜al_str (this=0x7ffe7ca66540, val_buffer=0x7fffec0f4370, val_ptr=0x7fffec0f4370) at /root/mysqlall大男人主义是什么意思/percona-server-locks-detail-5.7.22/sql/field.cc:5429#4 0x0000000000f11d7b in Field::val_str (this=0x7ffe7ca66540, str=0x7fffec0f4370) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.h:866#5 0x0000000000f4549d in Field::send_text (this=0x7ffe7ca66540, protocol=0x7ffe7c001e88) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/field.cc:1725#6 0x00000000014dfb82 in Protocol_text::store (this=0x7ffe7c001e88, field=0x7ffe7ca66540) at /root/mysqlall/percona-server-locks-detail-轿车外表5.7.22/sql/protocol_classic.cc:1415#7 0x0000000000fb06c0 in Item_field::send (this=0x7ffe7c006ec0, protocol=0x7ffe7c001e88, buffer=0x7fffec0f4760) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/it三金片的效果em.cc:7801#8 0x000000000156b15c in THD::send_result_set_row (this=0x7ffe7c000b70, row_items=0x7ffe7c005d58) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.c毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情c:5026#9 0x0000000001565758 in Query_result_send::send_data (this李师师=0x7ffe7c006e98, items=...) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.cc:2932#10 0x0000000001585490 in end_send (join=0x7ffe7c007078, qep_tab=0x7ffe7c0078d0, end_of_records=false) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:2925#11 0x0000000001582059 in evaluate_join_record (join=0x7ffe7c0毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情07078, qep_tab=0x7ffe7c0毓怎样读,技术同享 | MySQL:timestamp 时区转化导致 CPU %sys 高的问题-一脸苦相的容貌,杂乱的日子,争议的心情07758)
标签: 未定义标签
admin 14文章 0评论 主页

  用户登录