系统迁移过程中发现的一些坑(CentOS 6 到 CentOS 7),并不一定有普适性,记录在此:

TCP_NODELAY

socket 交互过程,即使一个简单的小数据包,发现网络传输上的耗时也有将近40ms(或者38ms,39ms的样子),同样的代码,在原系统上毫无问题,新的系统上就死活表现不正常。最终发现是TCP_NODELAY未开启,简单的说,就是数据包要凑够一定大小才发送,否则就等一个固定的时间间隔才发送,主要是对于以前带宽小,网络条件不好时候的特定优化,对如今耗时敏感的场景并不合适。相关介绍,请参见:TCP启用和禁用 TCP_NODELAY 有何影响?

gettimeofday

gettimeofday,在不同系统上,表现不同,最坏情况下,性能开销比较大,如果是需要计算时间间隔,可以实测与 clock_gettime 的对比(建议简单写个循环,测试一下耗时,在我们的环境上,gettimeofday 进入了系统调用,开销差了10倍)。相关讨论见:faster equivalent of gettimeofdaygettimeofday() should never be used to measure time

CentOS 7 更换内核

centos 7上更换内核的文章很多,除了 rpm 或者 yum 安装新内核的包外,就是更改 grub 的配置了,绝大多数文章也会说到先查看新内核 menuentry 的序号,然后修改/etc/default/grub 中 GRUB_DEFAULT 为对应的序号即可,或者将GRUB_DEFAULT 改为 saved 然后使用 grub2-set-default 设置新内核的序号或者 title 即可,然而……我遇到的情况则是以上操作重启后均未生效,百般实验,最终实践证明,grub2-mkconfig -o /boot/grub2/grub.cfg 使之前的操作生效,这一步应该是在重启前,修改 grub 配置之后,最终证明靠谱的操作顺序是:

# 安装对应的内核rpm 包
rpm -ivh --oldpackaged --replacefiles  [kernel-headers.x86_64  kernel-devel.x86_64 kernel-tools-libs.x86_64 kernel-tools.x86_64 kernel.x86_64]

# 查看新内核 menutry 启动顺序
cat /boot/grub2/grub.cfg |grep menuentry

# 设置内核启动顺序
sed -i "s/GRUB_DEFAULT=0/GRUB_DEFAULT=1/g" /etc/default/grub

# 设置生效
grub2-mkconfig -o /boot/grub2/grub.cfg

GPU 显存变小

事情是这样子的,有一批P4的线上 GPU 机器是分批到位的,cuda 驱动也由厂商安装好,安装线上服务时发现第一批机器显存比其它机器要少接近500M,导致不能与其他机器一样同构部署。具体表现是使用 nvidia-smi 命令查询时,显示显存只有 7606 MiB,而正常的机器则有 8115 MiB。这个问题困扰了好几天,各种更换内核,重装驱动未果,正准备让厂商替换时,突然发现其 ECC 并没有关闭,使用 nvidia-smi -e 0 关闭重启之后,发现显存正常,恍然大悟。ECC memory 是一种修正错误内存技术,需要占用一定存储空间,关闭之后不进行检查,性能也能有10%~15%的提升。果然各种奇奇怪怪的问题最终的原因都很简单

其它

...