背景
最近在使用mpstat做数据采集分析的时候,发现mpstat采集的数据格式有2种不同的情况。如下图1、2所示。
图1 mpstat显示不含AM/PM
图2 mpstat显示包含AM/PM
从显示分析看图一与二唯一的差异性就是时间的显示差异性。图一是24小时制,图二是12小时制。为什么会出现这样的情况呢?
原因分析
通过下载源码分析 https://github.com/sysstat/sysstat,发现影响结果的原因是LC_TIME变量的设置。
char *setlocale(int category, const char *locale)
● locale – 如果 locale 是 NULL 或空字符串 “”,则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。
然后查看系统变量,结果一的locale变量显示
$locale
LANG=en_US.UTF-8
LC_TIME=“C”
LC_ALL=C
结果二的locale变量显示
#locale
LANG=en_US.UTF-8
LC_TIME=“en_US.UTF-8”
LC_ALL=
将结果二的机器的环境变量LC_TIME="en_US.UTF-8"修改为LC_TIME=“C”,最终结果输出一致。
locale说明
在Linux系统,locale命令来设置和显示程序运行的语言环境,locale会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。
按照如下规则设置:
<语言>_<地区>.<字符集编码><@修正值>
如: zh_CN.UTF-8,zh 表示中文,CN 表示大陆地区,UTF-8 表示字符集
locale涉及到的变量如下: (优先级:LC_ALL > LC_* > LANG)
LANG=en_US.UTF-8 #LANG的优先级是最低的,它是所有LC_*变量的默认值
LC_CTYPE=“en_US.UTF-8” #字符分类和字符串处理,控制字符处理方式,字符编码,是单字节还是多字节
LC_NUMERIC=“en_US.UTF-8” #格式化非货币的数字显示
LC_TIME=en_US.UTF-8 #格式化时间和日期
LC_COLLATE=“en_US.UTF-8” #比较和排序
LC_MONETARY=“en_US.UTF-8” #格式化货币单位
LC_MESSAGES=“en_US.UTF-8” #控制程序输出时所使用的语言
LC_PAPER=“en_US.UTF-8” #默认纸张尺寸大小
LC_NAME=“en_US.UTF-8” #姓名书写方式
LC_ADDRESS=“en_US.UTF-8” #地址书写方式
LC_TELEPHONE=“en_US.UTF-8” #电话号码书写方式
LC_MEASUREMENT=“en_US.UTF-8” #度量衡表达方式
LC_IDENTIFICATION=“en_US.UTF-8” #locale对自身包含信息的概述
LC_ALL= #它不是环境变量,是一个宏,可以通过该变量的设置覆盖所有LC_*变量