博客也是好久没更新了,说说最近的折腾吧。

原有服务器是E3-1245 v2 + P8B-C/SAS/2L,16GB 纯ECC,千兆局域网。由于担心NAS数据安全,没做 RAID 5,板载RAID控制器不支持RAID 6,索性刷了直通,各个单盘独自运行,重要数据通过 powershell + fastcopy 定期备份。机械硬盘速度平均也就100+MB,千兆局域网可正好够用。期间也使用过两块SSD给分别给机械硬盘做读,写缓存。用以提升4K读写性能。

但也只是够用,也限制了进一步的折腾空间,想要提升NAS的数据读写速度,就得考虑两个问题:1,硬盘速度 2,网速

  1. 要提升硬盘速度,固态硬盘是别想了,太贵,而且容量也不大,还有磁盘快满时的性能严重下降、擦写加剧的问题,还是考虑机械硬盘,而机械硬盘速度提升也还是组RAID模式,(ZFS及各种文件系统比较小众,出问题也不好解决)组RAID 5数据又不放心,组RAID 6还得换硬件。
  2. 要提升网速,也有两个思路,(1)千兆网卡链路聚合(2)上万兆。链路聚合的话还需要交换机支持,而且特定情况也不一定有效,而且NAS和PC分别还要再加网卡,两个千兆口汇聚也还才最高250MB,这时就已经是4块网卡了,继续加网卡3口汇聚,成效不大,而且网卡越多,坏的几率也更高。

既然硬盘速度提升要换硬件,网速提升也要换硬件,干脆直接一步到位吧。于是。。。

以下是新入手的装备:

  1. ASUS XG-C100C 万兆网卡
  2. NETGEAR Nighthawk SX10(GS810EMX) 双万兆交换机,
  3. 二手Dell R720xd + E5 2690v2 + 16GB 1866 REG ECC *4 + H710P + 原装万兆网卡 +后置硬盘模块 + SD卡模块
  4. 当然还有两块SD卡

上万兆对到底用光口还是电口也纠结了好久。光口的话有好多便宜的垃圾可捡,无论是网卡、光模块还是交换机,但是光模块分厂家和类别,非常麻烦,而且二手交换机噪音功耗也比较大。电口的话,几乎没有二手交换机可捡,全新的又好贵。

决定用电口时,最初交换机的选择是华硕的XG-U2008,但是阉割了端口聚合、组播控制功能,售价2000,这就有点不厚道了,我可能不用,但你不能没有,因为谁知道我以后用不用得到呢?最终在亚马逊上海淘了现在的 SX10 ,有上述的功能,而且算上海关税也才1600+,算是厚道了。到手后全金属外壳,很厚重。一直以为是塑料的,用了几天才知道为什么是全金属外壳了,发热好高,摸上去都烫手。万兆网卡也是如此,拆下散热片,重新涂了硅脂,换了新的导热贴。不过就有有点纳闷为什么散热片和芯片中间还有个导热贴,不是直接接触呢?

前前后后折腾了20几天,也碰到了很多烦心事:

  1. 后置硬盘模块到手有问题不能识别
  2. 服务器到手不能识别内存,而且风扇直接跑到一万转,真的是飞机起飞,妥妥的有问题
  3. 发回来的服务器CPU散热器,每个都有3个坑洼,联系客服发回来的还是有坑洼,最后直接让我从别的地方买吧。也是够了。

换了服务器风扇转速明显正常了,开机也就5、6千的转速,虽说噪音还是大,那些说开机风扇起飞的,你们是没碰到100%风扇转速的情况

Anyway,不管怎么样,东西到齐了,也算是搞得差不多了,除了预期的4块4TB机械硬盘还没入手。

一共12个3.5英寸盘位 + 2个2.5英寸盘位。

新服务器 ESXi 装在了SD卡模块上,两块SD卡做了镜像,这样的好处是更加方便了,(1、节省硬盘位;2、vmfs升级时不能升级ESXI系统本身所在的硬盘)。

然后用两块 128GB 的 SSD 组了 RAID 1,作为ESXi的数据盘。 直写,关闭预读。

剩下几块容量不等的硬盘,不好组RAID,暂时还是单盘使用,因为还是单盘,索性直接打开了磁盘缓存。回写,自适应预读

然后用一块 512GB 的 SSD 做了 CachaCade,用于加速机械硬盘,H710P 最大只支持 512GB 的 CacheCade。

测试数据盘的顺序读写可到 600MB ,这还是单盘没组 RAID 的情况下,当然随机读写就低了,也是没办法的事。

机器到手后一步一步将各个固件升到最新,没想到电源都有固件。

感觉默认的自动风扇转速还是高,于是网上找了下 ipmi 控制风扇转速的脚本,都是放到 cron 里执行的, 因为 cron 最小执行粒度是一分钟,对于突然升高的负载 温度急剧升高的情况根本没有办法,要么直接过热关机,要么就有损寿命。于是就改了下,作为守护进程启动,轮询,自动注册成 systemd 的服务,自动开机启动,当然还保留了 cron 执行作为备用, cron 执行时会检测服务进程是否运行,运行则退出,没有运行的话再进行温度控制。

另外也写了脚本自动上传ssl秘钥和证书到idrac(因为是 let'sencrypt 签发),再也不用看到idrac的不安全警告了。

#!/bin/bash

# 守护进程
# 自动添加到 systemd 服务,自动启动,自动开机启动
# 自动添加 cron 任务作为备用,两者不冲突,当服务启动失败时 cron 任务生效
# 仅支持使用 systemd 的linux发行版


DATE=$(date "+%Y-%m-%d %H:%M.%S")
echo "$DATE"

PID_FILE="/run/dell_ipmi_fan_control.pid"
IDRACIP="IP地址"
IDRACUSER="用户名"
IDRACPASSWORD="密码"
TEMPTHRESHOLD="55"


DIR=$(cd "$(dirname "$0")";pwd)
FILENAME=$(echo $0 | awk -F "/" '{print $NF}')

if [ -f /etc/os-release ]; then
    source /etc/os-release
    if [ "$ID" == "centos" ]; then
        grep $FILENAME /var/spool/cron/root
		if [ "$?" != "0" ]; then
			echo "*/1 * * * * /bin/bash $DIR"/"$FILENAME >> /tmp/dell_ipmi_fan_control.log" >> /var/spool/cron/root
		fi
    elif [ "$ID" == "ubuntu" ]; then
		grep $FILENAME /var/spool/cron/crontabs/root
		if [ "$?" != "0" ]; then
			echo "*/1 * * * * /bin/bash $DIR"/"$FILENAME >> /tmp/dell_ipmi_fan_control.log" >> /var/spool/cron/crontabs/root
		fi
    fi
else
    echo "系统版本过低"
    exit
fi

if [ "$ID" == "centos" ]; then
    if [ "$VERSION_ID" -ge "7" ]; then
        HAS_SYSTEMD=true
    fi
elif [ "$ID" == "ubuntu" ]; then
    if [ $(echo "$VERSION_ID >= "16.04"" | bc) -eq 1 ]; then
        HAS_SYSTEMD=true
    fi
fi

echo 
if [ "$HAS_SYSTEMD" == true ]; then
    SERVICE_PATH="/etc/systemd/system/dell_ipmi_fan_control.service"

    if [ ! -f $SERVICE_PATH ]; then
        FIRST_RUN=true
        cat>$SERVICE_PATH<<EOF
[Unit]
Description= dell fan control with ipmi
After=network.target
Wants=network.target

[Service]
Type=simple
PIDFile=/run/dell_ipmi_fan_control.pid
ExecStart=$DIR"/"$FILENAME

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl start dell_ipmi_fan_control.service
    systemctl enable dell_ipmi_fan_control.service

    fi
fi


if [ "$FIRST_RUN" == true ]; then
    exit
fi

if [ -s $PID_FILE ]; then
    PID=$(cat $PID_FILE)
    echo "服务运行,pid=$PID,退出"
    exit
else
    echo $$ > $PID_FILE
fi

while true; do
    T=$(ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD sdr type temperature | grep -E "^Temp" | cut -d"|" -f5 | cut -d" " -f2 | grep -v "Disabled")

    if [[ $T =~ ^\d* ]]; then
        echo "$IDRACIP: -- 当前温度为 $T度 --"

        if [[ $T > $TEMPTHRESHOLD ]]; then
            echo "--> 温度高于55度,启用自动风扇控制"
            ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x01 0x01
        else
            echo "--> 温度低于50度,启用手动风扇控制"
            ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x01 0x00

            if [[ $T > 45 ]]; then
                echo "--> 温度高于45度,设定风扇转速为16%"
                ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x02 0xff 0x10
            else
                echo "--> 温度低于40度,设定风扇转速为 10%"
                ipmitool -I lanplus -H $IDRACIP -U $IDRACUSER -P $IDRACPASSWORD raw 0x30 0x30 0x02 0xff 0x0a
            fi  
        fi  
    else
        continue
    fi  
done