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

原有服务器是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的不安全警告了。

像往常一样,偶尔想起看看本站的访问情况,发现点击量高的可怕,并且不断再升高。

查看nginx日志,发现全都是来自不同地址的同一个请求,看来是遭到CC攻击了。最早的攻击来自于2月20日上午10点47分50秒,然后便像洪水一样持续到了现在。

Nginx日志在26日凌晨自动进行了分割,单单对26日的部分日志进行过滤就得到了1万3千多个攻击IP,这还是去重之后的。

令我自己都吃惊的是,遭受到攻击后本站一直正常运行,甚至访问速度都未减慢,这几天照常编辑了几篇文章,都没感觉到异常。看来平时的优化没白做。

在采取了多种不同的措施来缓解了攻击压力之后,CPU从百分之5/6十,下降到了正常水平。

然而攻击还在持续。本人在网上也没什么仇人,甚至都不怎么评论,是谁手里有这么多的肉鸡呢?或者是伪造的TCP数据包?这就无从得知了。

先贴上链接吧:https://github.com/frostnotfall/DoubanMovieTool

恩,这是一个关于电影的bot。基于豆瓣的数据实现。

过年一堆琐碎闲事,愣是拖到了今天才再次更一下博客。

最初的版本功能只有一个,根据电影的影评生成词云图片;半年后在此基础上添加了一些其他的功能,使之成为了一个便捷的电影工具。

基于Python实现,提供目前有“正在上映”、“即将上映”、“新片榜”‘“快捷搜索”等功能,还有一个基于旧接口实现的搜索(不太准,以后可能遗弃),通过CustomKeyboardButton、InlineKeyboardButton,InlineQuery,Instant View 方式呈现输出。

逻辑代码基本通过爬虫实现获取数据,少数数据通过接口获取。比较头疼的是这个框架并没有详尽的的文档,只有最简单的功能示例。碰到问题磕磕碰碰,最终还是完成了。

比较遗憾的是工具本身基于聊天平台,该聊天工具的数据呈现方式只有单一的text,image,vedio等,并不支持两种以上的复合呈现(尽管如此,还是比微信要好用多了)。所以尽可能通过CustomKeyboardButton、InlineKeyboardButton,InlineQuery呈现输出,避免交互方式单调,尽管如此,还是有些掣肘。

比如,api 提供图片+文字的数据发送方式,并且文字支持markdown或html解析,但是只支持最基本的粗体、斜体、url插入等方式,甚至不支持字号的设置。

目前已添加了 Instant View,电影详情以及影人详情经由 Instant View 输出,规避了之前的问题,数据呈现方式比原先好了不少。

开始的几个版本中,电影、演员的搜索方式通过返回文本+字符串截取的方式来实现,想来想去还是不太方便了,于是开始加入“快捷搜索”功能,(效果图见下方)通过InlineQuery返回结果,所见所得(之前的搜索功能依然保留,后期可能会弃之不用了)。

其他效果图就不贴了。

目前还想加入一项 top250 的功能,但是以当前使用的交互方式并不合适,所以可能会添加 Instant View 来改善一下数据的呈现方式。除此之外,目前想不到其它可添加的功能了。

2.17更新:关于 top250 的功能,目前考虑的方式是使用内联键盘更新按钮的方式。目前待定吧。

2.25更新:已添加。 采用列表分页, 通过内联键盘更新。

关于性能优化:

目前按照 python-telegram-bot开发者的建议,使用了 run_async、 wekhook 和ujson 库,但问题并不在这里,而是网络延迟,目前服务器到豆瓣的 ping 值 有250+ms,单纯请求一次http就要花费1.5s的时间,与 telegram 服务器之间的延迟也有130ms左右,真正留给程序的时间并不多,虽然对获取评论这种需要多次url请求的地方做了异步,(开始是使用多线程,但考虑到单核CPU多线程的创建、切换、销毁的开销......so),但对单个的请求使用异步并不能带来速度的提升。

所以如何缩短这部分的时间一直在考虑中:

  • 加缓存或许是个不错的方案,但使用的人少,命中率也低。
  • 加CDN也行,但也只降低了程序到telegram服务器的延迟。与豆瓣服务器的延迟没有改观。毕竟域名不是自己的。
  • 走国内代理,但免费代理很少有国际线路优化的。

非常抱歉回复晚了

原荒野无灯的脚本修改返回值,脚本如下:


#!/bin/sh

#################################################
# AnripDdns v5.08
# 基于DNSPod用户API实现的动态域名客户端
# 作者: 若海[mail@anrip.com]
# 介绍: http://www.anrip.com/ddnspod
# 时间: 2016-02-24 16:25:00
# Mod: 荒野无灯 http://ihacklog.com  2016-03-16
#################################################

# 使用Token认证(推荐) 请去 https://www.dnspod.cn/console/user/security 获取
arToken="*****,***************"
# 使用邮箱和密码认证
arMail=""
arPass=""

# 获得外网地址
arIpAdress() {
    local inter=`nvram get wan0_ipaddr`
    echo $inter
}

# 查询域名地址
# 参数: 待查询域名
arNslookup() {
    local inter="http://119.29.29.29/d?dn="
    wget --quiet --output-document=- $inter$1
}

# 读取接口数据
# 参数: 接口类型 待提交数据
arApiPost() {
    local agent="AnripDdns/5.07(mail@anrip.com)"
    local inter="https://dnsapi.cn/${1:?'Info.Version'}"
    if [ "x${arToken}" = "x" ]; then # undefine token
        local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}"
    else
        local param="login_token=${arToken}&format=json&${2}"
    fi
    wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter
}

# 更新记录信息
# 参数: 主域名 子域名
arDdnsUpdate() {
    local domainID recordID recordRS recordCD
    # 获得域名ID
    domainID=$(arApiPost "Domain.Info" "domain=${1}")
    domainID=$(echo $domainID | sed 's/.\+{"id":"\([0-9]\+\)".\+/\1/')
    # 获得记录ID
    recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}")
    recordID=$(echo $recordID | sed 's/.\+\[{"id":"\([0-9]\+\)".\+/\1/')
    # 更新记录IP
    recordRS=$(arApiPost "Record.Ddns" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_line=默认")
    recordCD=$(echo $recordRS | sed 's/.\+{"code":"\([0-9]\+\)".\+/\1/')
    # 输出记录IP
    if [ "$recordCD" == "1" ]; then
        echo $recordRS | sed 's/.\+,"value":"\([0-9\.]\+\)".\+/\1/'
        return 1
    fi
    # 输出错误信息
    echo $recordRS | sed 's/.\+,"message":"\([^"]\+\)".\+/\1/'
}

# 动态检查更新
# 参数: 主域名 子域名
arDdnsCheck() {
    local postRS
    local hostIP=$(arIpAdress)
    local lastIP=$(arNslookup "${2}.${1}")
    echo "hostIP: ${hostIP}"
    echo "lastIP: ${lastIP}"
    if [ "$lastIP" != "$hostIP" ]; then
        postRS=$(arDdnsUpdate $1 $2)
        echo "postRS: ${postRS}"
        if [ $? -ne 1 ]; then
            return 1
        fi
    fi
    return 0
}

###################################################
# 检查更新域名

arDdnsCheck "frostfall.cn" ""

if [ $? -eq 1 ]; then
    /sbin/ddns_custom_updated 1
else
    /sbin/ddns_custom_updated 0
fi


先附上脚本地址 https://github.com/frostnotfall/DNSPodDdns

==================================================

目前联通已可获得ipv6地址,遂将原荒野无灯基于 anrip 的脚本添加了ipv6的动态解析支持
荒野无灯原帖:http://koolshare.cn/thread-37553-1-1.html

主要做了以下几点修改:
1. arNslookup (查询域名已解析的IP地址 )修改为 dnspod api post方式
2. 梅林固件重启后不会立刻获取到公网 ipv6 地址,当脚本检测不到 ipv6 地址时会等待 5 分钟后重新获取,还是没有则继续等待 5 分钟 ,以此类推,期间梅林控制台页面会显示叹号,但此时 ipv4 动态解析已经可用
3. 域名,二级域名 的传入参数作为全局变量使用,相关函数的传入参数做了简化

使用此脚本,需:
1.指定 arToken ,Token请去 https://www.dnspod.cn/console/user/security 获取
2.指定 arDdnsCheck "域名" "二级域名(可为空)" 如:
arDdnsCheck "baidu.com" ""  会动态解析 baidu.com 域名
arDdnsCheck "baidu.com" "www"  会动态解析 www.baidu.com 域名
3.因为 ipv4 与 ipv6 使用不同的recordID,使用脚本前先在 dnspod 官方控制台页面添加该域名(或二级域名)的 AAAA 记录,以生成 ipv6 的recordID

提醒:一般用作动态解析的域名,不会做 dns 负载均衡,所以为避免可能出现的问题,尽量只保持一个A记录和一个AAAA记录,避免解析错误,当然CNAME或NS等其他不受影响

1.恢复时 gitlab 版本应与备份时版本一致

2.默认卸载不完全,最好同时删除以下目录


# 同时删除备份目录,注意将备份文件保存至别处,/etc/gitlab/目录最好也备份下

rm -r /opt/gitlab/sv /opt/gitlab/service /opt/gitlab/init /opt/gitlab/etc /opt/gitlab/embedded/ssl/certs /opt/gitlab/embedded/service/gitlab-shell /opt/gitlab/embedded/service/gitlab-rails/public /opt/gitlab/embedded/service/gitlab-rails/config/initializers /opt/gitlab/embedded/cookbooks /var/opt/gitlab /opt/gitlab /etc/gitlab

# 删除 systemd 启动文件,否则安装新版本后执行 gitlab-ctl reconfigure 会卡住

rm /usr/lib/systemd/system/gitlab-runsvdir.service

3. gitlab 恢复后如果进入项目 返回500错误,db_key_base 问题,将之前的 /etc/gitlab/gitlab-secrets.json 文件拿过来替换(最好备份时一同备份),然后执行 gitlab-ctl reconfigure

迅雷是越来越不能用了,卸了好多次又装,这次是终于下决心不再用了,年费超级会员就当白扔了,祝早亡。

作为替代的下载工具,qbittorrent 着实不错,代码开源,一般的做种功能就不说了。有 Web UI,可根据 Client IP 设定白名单免密码访问,觉得原版 Web UI 丑的话,甚至可以替换成自己的 Web UI,支持动态域名,提供 WebAPI,支持导入 TLS 证书,支持RSS订阅,下载完成后可以电子邮件通知,也可执行外部程序(这里我使用windows 局域网通知功能),另外Wiki 也很详细。作为 NAS 上的下载工具非常不错。

qbittorrent 支持导入外部 Tracker 功能,玩BT下载的都知道 Tracker 的重要性,但是 Tracker 地址的维护却一直是个问题,Github 上一直在维护的的 trackerslist 数目终归是太少。

想要提高下载速度,只能自己维护了。

于是自己写了个 Tracker 维护脚本,通过遍历目录下的 Torrent 文件,提取出 Tracker 地址,做连通性测试,记录有效的地址到 txt 文件中,然后去重。

代码不多,100来行,做了多线程优化,速度也还行。放在了 Github 上。

可惜的是 qbittorrent 本身的 API 不支持永久导入 Tracker 功能,只能手动,也不支持插件的方式来实现,目前只支持搜索功能的插件,当然因为开源的原因,可以理解。

当然也不是没办法,配置文件是明文,可以通过替换特定行的方式来实现,以后再说了。

 

原 E5 双路,E7 系列:铂金(Platinum)、金(Gold)、银(Silver)、铜(Bronze)。

第一位数字:8(铂金)、6/5(黄金)、4(白银)、3(青铜)

第二位数字:代表第N代

第三四位数字:具体 SKU(库存单位)编号

第五位字母后缀:

F : Fabric;集成Intel OmniPath Fabric

T :高 Tcase/扩展可靠性;

M :每 CPU 插槽支持 1.5TB 内存容量,无则为 768GB

P:采用 FPGA 封装

E5 单路,为工作站用途,命名为 Xeon W

E3 命名为 XEON E 代表Entry,入门级工作站处理器

原 Xeon D 保持不变