如何评估一台服务器(管理)

之前我们引进一台新款服务器之前,并没有对其有一个综合的评估,更多是是感性上的认识,没有数据来做支撑。
最早的时候用的是大众型的 11G,12 年升级到了 12G,当时我做的最多的工作就是尽可能的熟悉服务器的每一个细节,每一个硬件配置的差异以及由此带来的影响。后来业务发展需要引进更多型号的机器,为此需要对这些机型做一个客观公正的评估。
g 了不少做 benchmark 的文档,但是说的都比较皮毛,尤其对于对整款机器的测评,更是少之又少。为此,我写了一个小系列,从服务器的各个方面给出一个比较综合的评估方案。注意,仅仅是评估的方案,基本不涉及最终的测试结果,对目前主流的机架式服务器具有通用性。

不少做 benchmark 都是把目光集中在处理性、内存、磁盘、网卡的性能上,却忽略了一个非常重要的方面,那就是服务器可管理性。因此,这一篇主要涉及的就是服务器的可管理性。至于处理器、内存、磁盘、网卡这几个细分领域,网上的资料比我写的好的多,我只会做一些总结,提供一些比较通用的 benchmark 工具。

从管理这个角度来细分的话,可以分为下面几个方面,以下是我当年跟某厂商交流的大方向也是要解决的一些问题。解决了下面这些问题,服务器 OS 底层管理应该就不是什么大问题了。我简单的整理一下,同时,我也回答了一部分的问题,没回答的主要是不同厂商差异化引起的,这个各个厂商有不同的方案,很好解决。

1. 零部件
* BIOS 里面重要选项的设置、表达的意思以及使用的场景,是否有针对 BIOS 的测试报告(BIOS 的这个我曾经浏览了你们随机附带的光盘,里面有一个 3000+ 的文档,我发现里面关于 BIOS 的介绍比较肤浅,所以并不能获得有用的信息)
* RAID 卡,LSI 里面的重要参数的设置、使用场景,是否有针对 LSI 不同设置选项对系统产生的影响的测试
* 其他包括处理器、内存、PCIE 在内的主要硬件的介绍,你们内部是否有很对不同型号零部件的测试
* 远程管理卡的使用配置问题


2. 监控、维修
* 硬件的监控(ipmitool, megacli, sas2ircu),比如 LSI 的,我们之前会用 megaraid 来做监控,其他的一些部件我们会用 IPMI 来做监控。是否有更好的方式来及时的发现硬件的问题,比如硬盘
* ipmitool 对几个重要方面(inband, outofband)的支持完整性,是否都能很好的支持
* 几个核心的零部件,包括硬盘(SSD),RAID 卡(BBU),内存,CPU、主板。如何诊断这些部件出现问题,在 Linux 下面有什么权威的工具(ISM-cli-tools,可以做成 U 盘启动)、软件来判断、诊断问题


3. 自动化
* 有没有类似 DELL 的 OpenMange、DTK 等工具,可以自动的建立修改删除 RAID,另外远程卡的配置是否有比较自动化的方式。厂商出厂之前人肉帮我们都设置好是一回事,我们希望有更自动化的方式来完成

4. 其他
* 10G 网卡,fusion-io 等相对高端设备的介绍、使用、测试等等


5. 功耗
* 这个是必须要考虑的问题,可以看官方的 specs 得到一个最大值,可以自己分不同的等级跑一些压力测试,从而得到不同压力下的功耗问题

以上是在大规模上架服务器之前需要解决的问题,很不幸的是,在正常情况下,从我们接触到的厂商来看,由于沟通上(信息传递)的问题或者由于技术上的问题,他们并不能给出令人满意的答复。对于这类传统的跟互联网稍微沾点边的公司,大部分都由一些混日子的客户经理等角色组成,这也是为什么每年某些公司像批发商品一样一下子招一批应届生的原因,大部分进去之后都是充当这类的角色。不要觉得不可思议,我们是作为大客户的角色,上面的这些基本问题都不能很好的解决,可以想象一下,对于其他的客户,他们是怎样的一种态度以及实力。所以上面这些问题的解决是需要靠你自己,所幸有 google,因此真正的实施起来也不是很复杂,只不过需要一些时间来熟悉他们罢了。

接下来的几篇会涉及处理器、内存磁盘以及其他(非技术层面)这几个方面,网卡(《如何评估一台服务器(网卡)》)的测试以及优化在之前的已经写过一个完整系列,在这里就省略不写了。需要的可以看这里:

一名 ops 眼里的互联网职业

在友盟干的这几年算是把半个互联网的主流职业摸的半生不熟,下面是从主观的角度写写我对这些职业的认识,熟悉的就多写点,不熟悉的就少写点,注意了,是主观。

1. CEO
最开始那会,经常是手机不离手,据说是为了看监控。半年之后,虽然手机依然不离手不过好像就不是看监控了。后来,基本见不到人了,好像要去见 VC 忽悠钱或者要去参加大大小小的会。偶尔过来问下,稳定不?为啥又挂了?最近没被黑吧?应该早财务自由,"follow your heart" 了吧。另外,各位想靠创业实现财务自由或者想买套房的也醒醒,具体参见 Quora 上的 《 What startup could make me a millionaire in four years if I got hired as an employee today?

2. CTO
最开始还能涉及些跟技术工程相关的细节,后来公司大了,工程师多了,技术实现也多了,五花八门,也不可能由其一人面面俱到。后来聊的最多的是三观问题,做这件事的意义以及不做这件事的意义,时间证明,他说的话绝大多数还是有道理的。除此之外就是批钱,买设备要批,买服务要批,打的报销也要找签字。

3. COO/CFO/CxO
这几个职位好像在我们这边没有,不评论了。

4. 财务
被卖了之后,跟其配合做了不少财务预算工作,看上去正规了些。最擅长的就是拖欠,还好没有拖欠员工工资。

5. 投资人
出钱的,这行业最初看上去是高大上,动不动就是百万千万的,后来了解的多了发现也是鱼龙混杂,有点钱的都可以做投资。年初被卖假货的电商 M&A 了,即使按照优先清算,感觉做天使的那家跟 A 轮的那家也拿不到多少钱。大致算下估算下范围,投资人能拿到多少,几个创始人加上早期的那几个人能拿到多少,其他的人就真没多少钱了,上面都是些公开的资料。

6. 律师
最初感觉是一群神秘的逼格特高的群体,跟搞私募的类似,后来发现他们主要的工作就是把一份合同的每一个字都推敲的无懈可击,顿时觉得人生没什么意义了。幸好我没选这行。跟卖保险的一样,西装革履。

上面几个职位都是相对高大上的,下面说几个比较平民的职位,也就是互联网公司的屌丝群体了,主要就是工程师,只说比较基层的,向上的什么高级xxx、资深xxx、xxx架构师大家自行补脑吧。工程师普遍有个"问题",就是谁也瞧不起谁,认为技术上老子天下第一,这个现象我认为大多数时候是个好兆头,有问题,大家坐下来 code talks,总比一群无聊的帮派看不惯另外一群无聊的帮派私底下排队搞斗争强的多。这种自负的心态有时候也会带来一些问题,最明显的是会束缚你的眼界,天下不是所有的问题都是能通过技术解决的,更多的时候不过是做取舍罢了(tradeoff 最能表现这层含义)。

Continue reading

10G(82599EB) 网卡测试优化(other)

接下来的都相对比较杂。

txqueuelen 表示的是 device driver 里面 tx queue 的包的数量,跟 netdev_max_backlog 相反。主流的默认是 1000,不过即使是 1G 的网络,1000 也算是比较小的了,对于 10G  网络,完全可以调大:
# ifconfig eth2 txqueuelen 10000

DDIO(DCA)
之前的叫 DCA,对于 E5 的来说叫 DDIO(1, 2),就是让 NIC 不需要经过内存,而是跟处理器的 cache 直接通信。E5 的处理器默认都开启了 DDIO,并且 DDIO 没有任何的硬件依赖,对 app 来说也是透明的,不需要安装什么 driver,总之就是不需要人工的干预。但是,要真正的发挥他的作用,还是需要做 cpu bind 的。

NUMA 的问题
这个问题还比较常见,尤其在 db 上,不管是 MySQL 还是 MongoDB 都会遇到此类问题。最主要的就是理解下面这个:
# numactl –cpubind X –membind X my_app my_app_arg0 my_app_arg1 …

销售跟猎头(HR)

这里谈到的销售猎头(HR) 比较狭义,主要是从事互联网行业的,靠卖硬件设备、软件、服务的以及四处挖人卖人为生的人。需要注意的是,我提到的是猎头以及 HR,而非 HM。
正所谓世间万物都是有联系的,这两个看似不相关的职业其实有不少的共同点,最明显的两点:
1. 入行门槛低
2. 都是以售出获取提成为目的

入行的门槛低这个很好理解,由于这两个行业在大部分时候并不需要很深的知识积累,所以如果你在读书的时候没怎么好好学习,这两个行业绝对是首选,尤其是销售,门槛更低,由此造成的问题可以通过下面这些事情说明。以下是我从业以来,在跟销售猎头(HR)打交道过程中遇到的各种奇葩行为。如果看我博客的正好是位销售,猎头(HR),有则改之无则加勉吧。

先说销售:
* 在第一次正式沟通前就明确了工作时间(10:30 – 18:30),结果周一早上 8:30 被电话吵醒,扯了一堆在客户看来不值一提可能在他看来是天大的事
* 沟通(邮件、电话、见面)的次数还在个位数的时候,就开始催,催什么时候开始买产品、买服务
* 使用的邮箱各种山寨,从 163 到 sina 的都有,这不是小公司的专利,包括某些在 NASDAQ 上市的公司以及若干在大陆上市的公司
* 邮件称呼各种耸人听闻,比如你叫马哲超,在邮件里面称呼马工、马总、哲超、超哥还能接受,但是一上来 "马哲超你好",让人听了实在不大舒服
* 邮件基本格式不会使用,最明显的就是 cc,明明在邮件里面加了一堆人,最后他就直接点 "reply" 了
* 邮件的标题没有任何意义,给你发了封邮件,名字叫 "马哲超你好"
* 说约个时间请你喝咖啡,你把时间空下来,结果他迟到,最后结帐的时候跟我说钱不够了,当时我心中真是千万匹的草泥马啊
* 一旦谈判失败,立马挂电话,基本是不考虑后面可能会出现的合作了
* 不提前约时间,自己悄悄的过来,我遇到好几次前台小姑娘喊我说有个混蛋在前台坐着等我,我放下手中的工作,一看,继续千万只的草泥马
* 销售这个行业长的漂亮/帅点可能会有点优势,最起码客户愿意跟你说话,但是如果你的吨位比较大,实际工作能力差,态度也很差,出了问题不好好解决只知道发嗲

再说说猎头:
* 某些打着高端招聘旗号网站上那些猎头的照片真的让我感觉到一股浓浓的山寨风味,不知道从哪个村子里面走出来的,看到的人永远都是黑漆嘛乌的,不服的去 linkedin 上对比看看。
* 不守时,这个看来是不少人的共性。跟你约 10 点结果拖到 10:30  才开始;跟你说一天内答复,结果一周都没结果
* 有些主动联系你的,上来就是你们公司的某某某你认识吗,给个联系方式呗
* 绝大多数的猎头是不会从你的角度为你考虑职业生涯的,他们需要为他们的雇主服务,尽快的挖到人,谈好价格,然后拿钱进行下一笔买卖
* 其他的请参见上面销售提到的若干问题

刚实习那会儿我很不能理解为什么不少公司招人都要求 211/985 这样的硬性门槛,现在看来很好理解。不得不承认的是,211 出来的平均质量普遍比一个野鸡大学出来的高的多。比方说,名牌高校 1000 个里面有 900 个综合实力比较强的学生,一个野鸡大学 1000 里面正常应该不会超过 100 个,现在要举办一场宣讲会,不管在哪个学校举办,举办所需花费的资源都一样,那你说应该选择在哪个学校开宣讲会。同理,在发布招聘的时候同样会把一些硬性指标写死,虽然可能会错杀一两个,但是这会极大的提高招聘人员的效率。如果你收到了 1000 封简历,按照名牌大学跟野鸡大学人数比例 9:1(实际应该会超过这个比例,没有求证过) 来计算,这 1000 个里面会有 900 封野鸡简历,有 100 封的名校简历,按照上面的假设,可以发现这 1000 封里面会有 810 + 10 的低质简历,只有 100 多封的高质量简历,要收 800+ 的低质量简历(错别字,话说不完整,排版格式混乱,从业经历没有亮点等等)这个对于招聘人员来说实在是一种折磨。前段时间我在拉钩网以及 3w 招聘上发布了几则招聘信息,两个月下来收到了 50+ 的简历,绝大多数是看完一封删一封,看其中大部分的简历真的是一种痛苦,集合了低质简历的各种特征: 错别字、表述不清、故意夸大事实、排版格式混乱、从业经历没有亮点,总结一下基本的教育信息可以发现,绝大多数都是野鸡大学毕业;而看的上眼的那一小部分绝大多教育经历还是能够接受目前社会的认可的。所以为了减少对身心的折磨,为了节约时间,设置一个硬性的门槛是多么的重要。

说到买卖,一个卖物一个卖人。这年头没有哪个是傻子,早些时候,经常听到有说运营商钱多人傻,要卖设备要卖服务特别简单,搞搞关系就 OK,产品服务质量好不好不是最重要的,现在看来前者成立,但是后者完全不成立,天底下没人是傻子。专注的做好产品做好服务才是正道,更何况你们面对的可能是一个刚刚起步,会精打细算到一根网线多少钱的创业公司。

写这篇博客的目的一是给销售猎头(HR)看看,希望以后少遇到上面的这些情况;二是给可能会跟这二者打交道的同学看看,尽量少跟上面提到的这类打交道。

10G(82599EB) 网卡测试优化(中断处理)

这里主要涉及的是 core 的绑定问题,有时候不是简单的算几个 bitmask,写几个数字到 smp_affinity/smf_affinity_list 里面就完事了。

在做 affinity 的时候,有下面几点需要注意:
1. 千万千万在不要在做 affinity 的时候开启 irqbalance,否则你刚把 irq 给人肉指定好,他就自动给你給恢复成他那套了
2. 使用 iperf 或者其他的工具做 benchmark 时,需要开启多线程(-P),以满足多个 stream 的要求,否则不管你怎么分布,都只能压在某一个 core 上,造成 affinity 无效的幻觉
3. 能不用 HT 尽量别用,尤其对于 affinity 来说,效果并不明显,比较好的做法是以物理 core 的数量为参照,比如单路 6-core(开启 HT 则 12 core),设置 queue 的数量为 6 而非 12 比较好,具体的还是需要测试

目前,要对 NIC 做 affinity,最好的方式还是 NIC 支持 RSS(Receive Side Scaling) 也就是 multiqueue RX,这样可以很方便的将 irq(RSS) 映射到 core 上。基本上主流的千兆 NIC(bnx2, igb) 都支持,10G 的更是默认配置了,这个上篇已经说过。 各个 bitmask 的问题,不在这里说了。

在 interrupts 文件里面,能看到不少的诸如 IO-APIC-level, IO-APIC-edge, PCI-MSI-X 等术语,这些其实是跟各个设备支持的特性相关的,要看他们之间的演变过程,可以看这里

关于 IO-APIC-level 跟 PCI-MSI-X  的区别,是两个完全不同的产生中断的方式,前者(1, 2)  是使用硬件实现,比如 8259A,后者则是往某个特定的 address 里面进行写操作实现中断。
因此,要判断一个设备使用使用了 MSI/MSI-X 很简单,只要查看 interrputs 文件就可以了,IO-APIC-level 非 MSI,PCI-MSI 表示试用了 MSI,这个不仅仅限于 NIC。

而 IO-APIC-fasteoi 跟 IO-APIC-edge 的区别,很好解释。interrupts 触发的方式不同而已,一个是边缘(edge)触发,一个是条件(level)触发。

理解了上面了,可以发现,可能的中断方式基本是下面两种:
1. 将某个 irq 绑定到所有的 core 上
2. 将某个 irq 绑定到某几个 core 上,第一个只是第二个的一个特例
3. 将某个 irq 绑定到指定的某个 core 上

先来看前两种情况。其实就是 RR(round-robin) 的方式,或许能解决一些 bottleneck,但是更严重的问题来了,尤其对于网卡这种中断很频繁的设备来说,会造成 cpu cache missed,造成影响是直接访问内存比访问 cache 里面的内容慢 30x;并且对于流媒体来说,还可能造成 congestion collapse。另外,由于 APIC 的问题,可能无法实现上面的要求,比如,我想将 irq 60 绑定到 core 0 以及  core 1 上,或者想把 irq 67 分布到所有的 core 中,将 3 写入到 60 的 smp_affinity 不就可以了吗?实事是做不到的,并且上面已经说明了这样做没有意义的原因。将 CONFIG_HITPLUG_CPU 由原先的 yes 设置成 no 可能会解决问题,不过我并没有试过,尤其明白了上面将 irq 分布到多个 core 的不合理之处之后更没有必要这样做了。

明白了上面了问题,第三点说的将 irq 绑定到一个特定的 core 上的意义就很明显了。

千兆网卡(bnx2, tg3, igb) 的 MSI/MSI-X

几个主流网卡的 lspci 都列在了 gist 上:
* Intel 350 igb
* Broadcom 5709 bnx2
* Broadcom 5716 bnx2
* Broadcom 5720 tg3

broadcom 网卡,bnx2(BCM5706/5708/5709/5716), tg3(BCM5720) 驱动的有一个叫 MSI, MSI-X(Message Signaled Interrupt) MSI/MSI-X 的功能,可以取代原有的 Pin-based(8259A?) 的中断方式,在一定程度上提高系统的性能。 对于 MSI/MSI-X 来说,可能由于各种各样的原因没有被开启,比如在 bnx2 在 rhel 5 上就无法使用。 所以在使用这个特性之前,需要先确认清楚。如何确定 PCIe 使用了 MSI/MSI-X?通过 lspci 即可,一般情况下,在跟 MSI 相关的条目后面都会有个 "Enable" 的 flag,后面的 "+" 代表开启,"-" 代表禁用,下面这个是 rh6.2(2.6.32-279.el6.x86_64, 3.122 tg3):
# lspci  -v  | grep -i msi
        Capabilities: [90] Express Root Port (Slot-), MSI 00
        Capabilities: [60] MSI: Enable+ Count=1/2 Maskable+ 64bit-
        Capabilities: [90] Express Root Port (Slot-), MSI 00
        Capabilities: [60] MSI: Enable+ Count=1/2 Maskable+ 64bit-
        Capabilities: [90] Express Root Port (Slot-), MSI 00
        Capabilities: [60] MSI: Enable+ Count=1/2 Maskable+ 64bit-
        Capabilities: [90] Express Root Port (Slot-), MSI 00
        Capabilities: [60] MSI: Enable+ Count=1/2 Maskable+ 64bit-

或者通过 dmesg 也能看出来。
tg3 的 driver, rh6.2(2.6.32-279.el6.x86_64, 3.122 tg3):
# lspci | grep -i msi
[    3.660959] ahci 0000:00:1f.2: irq 116 for MSI/MSI-X
[    4.133211] megaraid_sas 0000:03:00.0: irq 117 for MSI/MSI-X
[    4.133226] megaraid_sas 0000:03:00.0: irq 118 for MSI/MSI-X

[    7.029578] tg3 0000:01:00.0: irq 134 for MSI/MSI-X
[    7.029598] tg3 0000:01:00.0: irq 135 for MSI/MSI-X
[    7.029612] tg3 0000:01:00.0: irq 136 for MSI/MSI-X
[    7.029627] tg3 0000:01:00.0: irq 137 for MSI/MSI-X
[    7.029641] tg3 0000:01:00.0: irq 138 for MSI/MSI-X

bnx2 的 driver, ubuntu 10.04.2(2.6.32-38-server, 2.0.2 bnx2):
# dmesg  | grep -i msi

[    4.691776] bnx2 0000:01:00.1: irq 61 for MSI/MSI-X
[    4.691785] bnx2 0000:01:00.1: irq 62 for MSI/MSI-X
[    4.691793] bnx2 0000:01:00.1: irq 63 for MSI/MSI-X
[    4.691801] bnx2 0000:01:00.1: irq 64 for MSI/MSI-X
[    4.691810] bnx2 0000:01:00.1: irq 65 for MSI/MSI-X
[    4.691819] bnx2 0000:01:00.1: irq 66 for MSI/MSI-X
[    4.691827] bnx2 0000:01:00.1: irq 67 for MSI/MSI-X
[    4.691836] bnx2 0000:01:00.1: irq 68 for MSI/MSI-X
[    4.691844] bnx2 0000:01:00.1: irq 69 for MSI/MSI-X
[    4.755025] bnx2: eth1: using MSIX


还有种通用的方式,直接查看 interrupts 文件,看关键字 MSI 就知道了:
# grep -i msi /proc/interrupts

由于之前遇到不少 bug,以上的内核都是升级过的,并非发行版本默认的内核。

但是到目前为止,很不幸的是,在主流的硬件厂商中,都表现的不是很好,各种 bug,需要禁用。可以从 kernel 的 config 中禁用再编译(CONFIG_PCI_MSI, X86_UP_APIC/SMP),或者从 driver 层面禁用。

最简单的关闭方式可以直接写到 modeprobe 里面:
# cat /etc/modprobe.d/msi.conf
options bnx2 disable_msi=1
# modprobe -r bnx2
# modprobe bnx2

以上仅仅是针对 bnx2 这个 driver 的,对于 tg3 的 driver,不支持像 bnx2 那样关闭,可以直接传递到内核的启动参数里面::
pci=nomsi
上面这个是对整个系统生效而非仅仅 tg3,所以如果使用了上面的方式,其他诸如使用到 MSI 的 megasas 也会失效。

最后,intel 的网卡也存在类似的问题

其实,要使用 MSI/MSI-X 无非是为了做 affinity,如果是多队列的网卡就没有这个问题了。如何查看网卡是否支持多队列,最简单的是从 interrupts 文件查看,或者看产品手册,一般都会写的很明确,multiple queue, rss 等关键字。如果该 NIC 不支持 MSI-X,那显然就不支持多队列了。目前主流的千兆应该都是支持的,最起码上面提到的几个都是支持的,差别在于支持多少的问题,比如 5720 只支持 5 个 queue,这个是写死在 driver 里面,无法改变的,有兴趣的可以看看 drivers/net/tg3.h 文件的宏定义:
#define TG3_IRQ_MAX_VECS_RSS        5

至于那些 bitmask 该怎么设置的问题,参考这个文档就好了。在具体设置的时候,还是发现不少问题,接下来一篇博客会解释。