宽带升级到100M之后……

前两天电信客服来电说可以把家里的宽带免费升级到100M,在外面想用家里的设备测一下实际的上下行速度。家里 7×24 小时开机的设备有一台 Mikrotik RB751G-2HnD 和一台 Buffalo LS-WXL (重刷了 Debian Wheezy 7.9),那就看看SpeedTest有没有 Linux Console 版本的吧。

果然在GitHub 上找到一个:https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
# wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
# chmod +x speedtest_cli.py
# ./speedtest_cli.py

执行下,结果还不错
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from China Telecom (121.231.9.15)...
Selecting best server based on latency...
Hosted by CHINA UNICOM JIANGSU COMPANY (Nanjing) [117.84 km]: 7.761 ms
Testing download speed........................................
Download: 93.06 Mbit/s
Testing upload speed..................................................
Upload: 4.23 Mbit/s

Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from China Telecom (49.89.188.61)...
Selecting best server based on latency...
Hosted by China Telecom JiangSu Branch (Nanjing) [198.70 km]: 11.072 ms
Testing download speed........................................
Download: 102.80 Mbit/s
Testing upload speed..................................................
Upload: 3.79 Mbit/s

再测一下 BT 下载速度,NAS 上用 transmission 下Fedora-24-Server 的镜像,速度完全只能达到3~4MB/s,dstat 一看,CPU 竟然满载……

再看一下 ROS 的 CPU Usage 竟然也达到 60~70%

看来是时候考虑新一波的设备升级计划了~~~

尝试Go两日感悟

以前虽然用 Go 写过一些小工具、脚本,但都没有能深入了解这门语言及其思想;恰好最近项目中有个功能相对简单的模块,原本计划使用 C++ 和 ZeroMQ 实现,所以借此机会再试一把。

这个模块的主要功能是一个作为 Broker(经纪人),监听来自客户端的 JSONRPC over HTTP 请求,经过分解,依次调用后端的一个或多个接口(基于ZeroMQ)。原先使用 C/C++ 的做法是:单线程、epoll、自定义异步状态机或协程(coroutine),这个方案的缺点也很明显:自定义异步状态机的逻辑复杂、协程的用法很不友好。

换成 Go,自然而然的用到 goroutine ,语言本身对协程的友好支持,写起来非常的自然;HTTP 服务用的是自带 Package 中的 net/http ,目前功能够用,省去了重复发明一套 HTTP 轮子;JSON 解析也ok,encoding/json也满足了需求;操作RAW Bytes使用 encoding/binary ,唯一的遗憾是这一次没有用到channel,因为与后端服务的链接时单一且纯异步的,还没有很清晰的思路如果利用channel来实现 ZeroMQ 的 Broker 模式,暂时还是使用两个 zmq.Dealer 实现了内部一个 Broker。

两天时间差不多写了1000+行代码,Golang 的优缺点:

  1. goroutine 写起来非常舒服,既有 coroutine 的轻量级,又有 thread 的便捷;
  2. 自带的Package很全面,基本能满足我目前的需求,远超STL,和QtCore差不多;
  3. 编译出来的二进制清清爽爽,就是喜欢这种静态链接,docker 绝配;
  4. interface{} 让人又爱又恨,尤其对于 JSON 的解析,但还得用reflect做检查;
  5. 语法方面需要适应,尤其是没有了OOP的支持;
  6. 源码目录结构,一开始没搞懂自己的package该如何存放,重新看文档才明白;
  7. 没有官方 IDE ,最后找了个 JetBrains PhpStorm 的插件,用着还凑活;
  8. 网上说的 goroutine 泄露暂时没遇到,可能是还没用到 channel吧;

总的来说,Go 还是非常值得尝试的,现在算是理解为什么 SRS 要用 Go 重写了。

基于GitLab的开发流程实施小结

最近协助一个开发团队实施了基于GitLab的开发流程,期间遇到的一些经验总结记录整理成本文。

该团队原先只有一个Subversion仓库,权限是按照目录分配的。同一个项目内的所有开发者都有提交权限,导致经常发生一些不该提交的文件被提交进仓库或者代码中包含了一些低级错误,等其他人发现为时已晚。因此迫切需要引入代码审查机制,第一时间对提交的代码进行审查,提高代码的质量。

组织架构及代码库规划

首先,为部门、项目组、个人分别建立账号;
其次,将原先单一的SVN仓库拆分成单独的Project。

组织架构及代码库示意如下:

repository-org

在GitLab上建立代码库

核心代码库是由原SVN库迁移导入,项目组将项目fork至项目组空间,开发人员从项目组fork至个人空间,在至此阶段GitLab上的仓库建立完毕。开发人员从本地通过git clone命令从将个人空间项目克隆至本地进行开发。流程示意如下:

workflow-1

本地开发仓库Pull与Push

注意:本地开发仓库的Pull与Push的远端URL是不同的。

更新本地仓库应从核心代码库拉取,因为核心代码库包括了其他开发者的工作成果;
提交应该至个人代码库,提交后在利用GitLab的Merge Request向上一级合并。

workflow-2

合并请求(Merge Request) & 代码审查(Code Review)

代码审查是在合并请求的过程中进行的,个人在GitLab中发起一个Merge Request,项目组会收到该请求,在GitLab界面上直接可以查看Commits和对比Changes,如果审查通过,Accept该请求,GitLab会自动Merge进项目组的代码库中;同理,项目组再向核心代码库发起Merge Request,由部门经过审查,则修改可以合并至核心代码库中。

workflow-3

以上是二级代码审查流程,其原理可以适用于更多层级的组织架构。

RouterOS的FastTrack与PCQ

新入一台Mikrotik CRS125-24G-1S-RM,划分了4个网段,并启用了端口隔离。

发现跨网段Bridging性能很低,Samba访问文件只有12MB/s左右的速度,远达不到官网标称的性能。

放狗找到官方论坛的一篇文章:http://forum.mikrotik.com/viewtopic.php?t=96302

从v6.29开始支持FastTrack,简单说就是启用后Firewall/NAT的性能直翻5倍!!!

测试了一把,Bridging的性能果然提升很多,Samba的速度大概有60MB+/s。

然而……鱼和熊掌不可兼得

原先的PCQ限速失效了:因为FastTrack会自动屏蔽Mangle其它规则,从而达到提升性能的目的。

ros_firewall_mangle

不差钱的还是上CCR系列,一劳永逸。

2016/05/22 更新:

经过几天鼓捣,发现FastTrack Connection规则可以不用在Filter表中添加,而是在Mangle表中独立添加。我的环境是加速LAN的跨网段访问速度,不经过NAT。

ros-fasttrack-pcq-update

注意:最上面3条动态规则在Filter表中取消FastTrack后自动失效,但是好像无法删除。

这样设定可以满足WAN上实现PCQ限速,内网三层交换速度不受影响。

Dell PowerEdge R510安装FreeNAS 9.10

计划将一台二手服务器(Dell PowerEdge R510) 改造为iSCSI-SAN/NAS,原配置如下:

  • Intel Xeon L5520 x2
  • 32GB DDR3 ECC
  • Dell PERC H700 RAID Card x1

ZFS建议直接控制硬盘,不建议通过RAID卡,以可以获得最佳性能和监控硬盘状态。H700这块卡不支持JBOD或“直通”模式,相反低端的H200可以通过刷新固件,成为纯HBA卡。当然如果用H700,也是有办法的:将每块硬盘都组成RAID-0;带来的问题是:ZFS无法直接读取硬盘的S.M.A.R.T信息,只能得到阵列的信息。

其它配件:

  • Dell PERC H200 HBA Card x1
  • Seagate ES.3 4TB 7200RPM/128M x6
  • SanDisk CZ33 16GB x1

STEP 1:更换H200阵列卡

Dell PERC H200 有两款:一款(备件号:47MCV)是带挡板给C1100、C2100机器用的,另一款(备件号:3J8FW)是不带挡板,但是在金手指旁有一个塑料卡扣,用于扣住PCI-E插槽的。R系列的机器用的就是不带挡板的型号,淘宝上购买时注意区分。

STEP 2:刷 IT Firmware

我参考了这篇文章:http://blog.michael.kuron-germany.de/2014/11/crossflashing-dell-perc-h200-to-lsi-9211-8i/comment-page-1/

主要几个步骤如下:

  1. 用Rufus制作一个FreeDOS的可启动U盘,将烧写程序、固件都拷贝进去
  2. 从U盘引导进入FreeDOS,运行sas2flash.efi -listall确认卡的Index
  3. 运行sas2flash.efi -c 0 -list记录下卡的SAS Address,后续要用到
  4. 擦除原来的固件和Boot ROM:sas2flash.efi -o -e 6
  5. 烧写Dell 6Gbps Firmware:sas2flash.efi -o -f 6GBPSAS.FW
  6. 烧写LSI P20 Firmware:sas2flash.efi -o -f 2118it.bin
  7. 重启,进入H200的配置界面可以看到Firmware的版本,厂牌也变成了LSI

STEP 3:安装FreeNAS

不再赘述,请参考 FreeNAS 官方文档。

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代理。