Category Archives: Linux

Linux clock source problem with Skylake-X processors

0x00

最近将一个在CentOS/RHEL 7.x下开发、运行的程序尝试移植到Ubuntu 16.04下,发现性能骤降,用perf top检查发现__vdso_clock_gettimeread_hpet的时间开销非常巨大。

0x01

Google搜了一圈:Two frequently used system calls are ~77% slower on AWS EC2
感觉是__vdso_clock_gettime没有能按照预期工作,而是每次都进内核读取硬件时钟。
但是我们的环境都是baremetal,并不是VM,理论上不应该是上述文中提到的原因。

0x02

因为代码中不少地方使用了clock_gettimeasiotimer,跟踪下去发现asio的底层使用了HPET,但是每个io_service仅使用了一个timerfd,大量的read_hpet应该是由clock_gettime调用的,一般来说clock_gettime不应该使用HPET这么高精度的时钟源。
顺着这个思路,发现两台机器的时钟源果然不同
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
出问题的这台显示是hpet,而正常应该为tsc

再查看当前可用时钟源,发现竟然没有tsc
$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource

离真相已经不远了。

0x03

出问题的是Intel Core i9-7900x(代号Skylake-X),怀疑是内核对新CPU的支持还不完善。
在 Kernel.org 的 Bugzilla 和 git log 里面发现类似的反馈:

Skylake-X的TSC晶振频率应该是25MHz,不是24MHz。内核在检测TSC时发现偏差,从而禁用了TSC,转用了HPET作为默认时钟源。

0x04

解决方案就是换最新的内核,我选用的是4.15.3,再验证可用时钟源和当前时钟源均为tsc无误,程序运行也恢复正常。

PS:至于开头__vdso_clock_gettime为何没有按照预期运行,而是每次都执行read_hpet,暂时未深入研究具体代码,以后有空再补……

Build Skia & libyuv

Skia

export HTTPS_PROXY=<YOUR_HTTP_PROXY>
export PATH="${DEPOT_TOOLS_DIR}:${PATH}"
git clone https://skia.googlesource.com/skia.git
cd skia
python tools/git-sync-deps
bin/gn gen out/Static --args='is_official_build=true skia_enable_gpu=false skia_enable_pdf=false skia_enable_discrete_gpu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false'
ninja -C out/Static

libyuv

export HTTPS_PROXY=<YOUR_HTTP_PROXY>
export PATH="${DEPOT_TOOLS_DIR}:${PATH}"
gclient config --name src https://chromium.googlesource.com/libyuv/libyuv
mkdir -p cache
sed -i 's/cache_dir = None/cache_dir = \"cache\"/g' .gclient
gclient sync
cd src
gn gen out/Release "--args=is_debug=false"
ninja -C out/Release

注:在梯子不稳定的情况下,启用cache_dir能解决git clone third_party中断的问题。

 

rsyslog处理大量冗余message

一年前给 Buffalo LS-WXL 重新灌了 Debian Wheezy 后,貌似 smartd/smartctl 和原先的 kernel “水土不服“,dmesg 中频繁打印:

program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO

估计是 smartctl 对 marvell 的支持滞后了,刚开始也懒得理它,后来发现打印是在太频繁了,导致 /var/log 下的日志文件占用了太多的空间:

Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 10:00:21 HOME-NAS kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO

在不想花费太多时间的情况下,想到从 rsyslog 下手,有两种方式:

方法一:合并重复的message,合并输出

在 /etc/rsyslog.conf 中加入
###########################
#### GLOBAL DIRECTIVES ####
###########################
$RepeatedMsgReduction on

最终日志文件会生成如下内容:
Jan 19 18:01:34 home-nas kernel: program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO
Jan 19 18:02:05 home-nas kernel: last message repeated 9 times
Jan 19 18:03:06 home-nas kernel: last message repeated 28 times
Jan 19 18:04:07 home-nas kernel: last message repeated 29 times
Jan 19 18:05:25 home-nas kernel: last message repeated 30 times
Jan 19 18:06:32 home-nas kernel: last message repeated 53 times
Jan 19 18:07:32 home-nas kernel: last message repeated 28 times
Jan 19 18:08:32 home-nas kernel: last message repeated 28 times

方法二:过滤不需要记录的message,完全禁止输出
在 /etc/rsyslog.conf 中加入
###############
#### RULES ####
###############

:msg, contains, "program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO" ~

注意:末尾的~符号是同一行,格式为:
:msg contains "要匹配的文本" ~

完美解决~~~

 

 

DevOps环境搭建指南

维基百科上关于DevOps的定义:

DevOps(英文Development和Operations的组合)代表一种文化、运动或实践。旨在促进软件交付和基础设施变更软件开发人员(Dev)和IT运维技术人员(Ops)之间的合作和沟通。它的目的是构建一种文化和环境使构建,测试,发布软件更加快捷,频繁和可靠。

DevOps环境是由多种工具或者工具链组成,一般按交付过程包含以下部分:

  • 编码:代码编写、审查、持续集成
  • 构建:版本控制、代码合并、构建状态
  • 测试:自动化测试及测试报告
  • 打包:二进制仓库、Docker镜像仓库
  • 发布:变更管理、自动发布
  • 配置:基础设施配置和管理
  • 监视:性能监视、用户行为反馈

下面列举我在日常工作中用到的工具、环境,具体的安装、配置方法请参考官方手册或借助搜索引擎。

RouterOS

RouterOS(简称ROS)是一个基于Linux的软路由系统,我一般使用ROS的以下功能:

  • VLAN——可以区分公司内部的开发、测试、办公网络,保证研发环境网络的可用性
  • L2TP/IPSEC VPN——每个人都可以随时接入公司网络,方便在外调试
  • DNS——将公司内部的服务都通过域名进行访问,无需记忆IP地址
  • DHCP——配合PXE网络安装环境使用

VMware ESXi

虚拟化利器,不多介绍。机器加足内存就好。

FreeNAS

可靠的存储是其它服务的基础,我个人倾向于使用独立的SAN/NAS设备而不是服务器的本地存储。

主要原因有以下两点:

  • ESXi只支持高端的硬件RAID卡,成本高
  • 需要一开始就规划好每台机器的需求,没法共享

利用FreeNAS可以提供iSCSI Target给ESXi使用,同时可以给每个人都提供独立的Samba空间——通过Windows共享访问。

选择FreeNAS还有一个重要的原因就是ZFS。

OpenLDAP

OpenLDAP用来存放组织结构树及相应的权限,GitLab、MediaWiki、FreeNAS都支持基于LDAP的用户认证。

GitLab

GitLab提供了Git仓库、Code Review(通过Merger Request实现)、Issue Tracker等功能。

我认为GitLab相比传统的Git Server、Visual SVN等工具,最为实用的一点就是每个人都有自己空间的管理权限。

比如很多尚未立项的小项目或个人项目,需要版本控制但是又无必要托管在部门的仓库上,有了GitLab便可以在自己的一亩三分地上随便玩了。

GitLab-CI

GitLab配套的持续集成工具,一般用来编译、构建和运行自动化测试。

简单、够用,yml语法也很简单。

Docker Registry

Docker镜像仓库,从GitLab-CI打包好的包会直接Push进入registry。

MediaWiki

GitLab针对每个项目都有wiki功能,但是我们需要一个独立于项目的知识库,因此选择了MediaWiki。

PXE/Mirrors

由于我的工作都是基于Linux的,经常要安装不同的发行版本,在公司内部部署一台PXE安装服务是非常必要的。

PXE环境一般由DHCP、TFTP和HTTP这三个服务组合实现的,DHCP由ROS提供。

ShadowSocks

针对特殊国情而配备,租用一个海外VPS,然后部署ShadowSocks,再部署Privoxy,将socks5转换为http代理。