从用zabbix到现在,一直为它的时间所困扰。在服务器上的系统时间和web

frontend上graph的横轴时间总对应不上,还有存储到mysql数据库中的clock值。之前也写了两篇关于zabbix时间的总结,但现在发现之前的认知很多都是错的。现在把到目前为止认为正确的东西,总结一下。

0.首先服务器上的系统时间要设置正确。不知道怎么搞的,我的服务器主机上的时间不对,直接比当地时间超前了8小时。悲剧。

1.zabbix系统的时区只与/etc/localtime有关。如果用/usr/share/zoneinfo/下面的某个时区文件(比如我用的Aisa/Shanghai)覆盖/etc/localtime,那么zabbix的系统时区就是相应的localtime(我的就是CST了)。如果不覆盖/etc/localtime,则zabbix就是采用UTC时间。这个可以通过敲入date命令看出来。

(网上也查了很多资料,关于linux系统时区的设置。比较多的是说与/etc/sysconfig/clock文件里的“UTC=true、false”有关。但zabbix的clock文件里边没有“UTC=true、false”,而且自己给加上这么一行也没用。而且与clock文件里的hwclock=--localtime无关系。即便=--localtime,如果不覆盖/etc/localtime,用date命令显示的仍是UTC。)

2.使用虚拟机时,真正的硬件时钟是server(也就是真实主机)上的硬件时钟。虚拟机启动时应该是读取server的硬件时钟,然后根据虚拟机系统的timezone设置来设定系统时间。在虚拟机上执行hwclock

-w命令并不会影响server的硬件时钟(在esxi4.0上部署zabbixappliance的环境下是这样)。虚拟机上的硬件时钟是假的,你把它设成多少,系统重启后它就变成多少,但这个值并不会影响虚拟机的系统时间,影响虚拟机系统时间的是server上的硬件时钟,就是coms里的值。

3.如果系统是utc时间,那么它的date与date

-u的值是相等的,且比server上的时间滞后8小时;如果系统时间是CST,那么它的date值与server时间相等,date

-u比date值滞后8小时。另外,与真假值无关,如果系统是utc时间,那么它的以下几个值是都相等的:

hwclock,hwclock -r,hwclock -u,hwclock

--localtime;如果系统时间是CST,则hwclock -u比其他三个时间滞后8小时。

4.zabbix数据库里的clock值为utc时间,与系统时区无关。也就是date

-u的时间。

5.mysql中from_unixtime()返回的值与mysql数据库所在系统的时区有关!!!如果系统是CST,则返回的结果会比utc时间再加上8小时!!

6.(C#中的方法)以你当地时间记为T,减去1970-1-1

0时,得到的timespan.Ticks/10000000,得到的结果就是unix

timestamp,也就是utc秒数。这个utc秒数记为A的话,在mysql中调用from-unixtime(A),则:

如果mysql所在系统是utc时间,那么返回的结果就是你的当地时间T;

如果mysql所在系统是CST时间,则返回的结果比T超前8小时!!

也就是用上述(c#)方法计算出的A,比unix

timestamp真值超前了8小时。正确的值应该是A再减掉8小时的秒数!!

7.zabbix

web-frontend显示的graph的横轴时间确实与/etc/php5/apache2/php.ini文件中的timezone的值有关。要设成你所在的时区才能使graph的横轴时间与你的当地时间保持一致。无论zabbix系统是utc还是cst还是别的,php.ini中的timezone都要设成你所在的时区。而且graph的横轴时间与/etc/php5/cli/php.ini里的timezone无关。(但不知道cli里的timezone关系到什么时间)。