挑选合适的VPS主机

虚拟专用服务器(英语:Virtual private server,缩写为 VPS),是将一台服务器分割成多个虚拟专享服务器的服务。实现VPS的技术分为容器技术和虚拟机技术 。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。
我们将通过几个方面的评测来帮助大家挑选合适的VPS。

虚拟化技术

虚拟化(技术)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境。
对于VPS来说常用的虚拟化技术有:

  • OpenVZ
  • Xen
  • KVM

Openvz

OpenVZ是操作系统级别的虚拟技术,即OPENVZ是本身运行在linux之上,并在底层操作系统上运行的一层应用,通过虚拟化技术将一个服务器安装成多个操作系统的实例,这样每个实例就是一个VPS,这意味着易于理解和低权重开销,并且应用无需近过虚拟指令可以直接运行在CPU上,直接调用母服务器中的内核,这样导致的性能损失较少。

优点:

  • 价格低廉,在不超售的情况下性价比高
  • 直接调用母核,性能损失少,性能搞

缺点:

  • 只能运行Linux系统,无法安装Windows等其他系统。
  • 共用母核,无法单独修改内核。
  • 作为应用层的虚拟化技术,厂商操作空间大,容易超售;资源共享,降低性能。
    • OpenVZ 的磁盘在母服务器上只是一个文件夹,磁盘超售难度低。
    • 共用CPU和内存,使用用户多,拉低性能。
  • 没用swap交换分区,内存一旦用完直接宕机。

Xen

Xen 是一个开放源代码虚拟机监视器(Hypervisor),由剑桥大学开发。它打算在单个计算机上运行多达100个满特征的操作系统。基于虚拟化技术的使用,分为Xen-PVXen-HVM 其中PV只能运行Linux而HVM可以运行windows实例。但一般PV效率要高于HVM

  • Xen-PV(准虚拟化):在使用中修改操作系统,从而使它发出的指令最优化,便于在虚拟化环境中执行(paravirtualization)
  • Xen-HVM(完全虚拟化):直接使用使用一个能理解和翻译虚拟操作系统发出的未修改指令的CPU(full virtualization)

Xen的虚拟化技术是自己运行一个内核的实例,可以自由加载内核模块、虚拟的内存和IO。并且加载的资源是基于母服务器的完全分割,在实例创建时就完整分配并直接占用母服务器资源。

优点:

  • 框架结构致使厂商超售难度大
  • 独享资源,同一母机的其他实例对自己影响较小
  • Xen-HVM可以运行windows实例
  • 有swap分区,内存不足也不会立刻宕机

缺点:

  • 系统层的虚拟化技术,对母服务器性能损失较大。
  • 价格较高,性价比较Openvz低。

KVM

KVM(Kernel-based Virtual Machine)也是一种用于Linux内核中的虚拟化基础设施,可将Linux内核转化为一个虚拟机监视器(hypervisor)。和Xen相似,不过由于使用的是完全虚拟化技术(full virtualization),用户可自己上传ISO或调用服务商自带的ISO手动安装系统。
由于和XEN类似,所以这里的优缺点就是以Xen来进行对比的。

优点:

  • 自由度大,用户可以自定义操作系统,甚至拥有独立的BIOS控制。
  • 由于完全开源,收到社区的帮助大。

缺点:

  • 完全虚拟化技术对母服务器的性能影响较大
  • 由于支持上传各种系统,同服务器下其他节点(node)安装过多windows等吃资源的系统会严重影响母机

查看自己的VPS虚拟化技术

提供一个简单直接的方法查看自己的vps的虚拟化技术:virt-what工具。
以我在vultr上的centos系统的vps为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@vultr ~]# yum install virt-what //安装virt-what(一般默认都是有的)
Loaded plugins: fastestmirror
Determining fastest mirrors
epel/x86_64/metalink | 16 kB 00:00:00
* base: mirror.tzulo.com
* epel: mirror.steadfastnet.com
* extras: mirror.tzulo.com
* updates: mirror.tzulo.com
base | 3.6 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/7): base/7/x86_64/group_gz | 166 kB 00:00:00
(2/7): extras/7/x86_64/primary_db | 156 kB 00:00:00
(3/7): epel/x86_64/updateinfo | 952 kB 00:00:00
(4/7): updates/7/x86_64/primary_db | 1.3 MB 00:00:00
(5/7): epel/x86_64/group_gz | 88 kB 00:00:00
(6/7): base/7/x86_64/primary_db | 6.0 MB 00:00:00
(7/7): epel/x86_64/primary_db | 6.6 MB 00:00:00
Package virt-what-1.18-4.el7.x86_64 already installed and latest version
Nothing to do
[root@vultr ~]# virt-what //使用virt-what查看主机虚拟化技术
kvm //基于KVM虚拟化技术

硬盘

硬盘是计算机主要的存储媒介,是用来存储和读取文件的。目前主要分为固态硬盘(Solid State Disk)和机械硬盘(Hard Disk Drive)。一般来说固态硬盘的性能好于机械硬盘。用来衡量硬盘指标的主要有容量I/O性能

IO即input/output(输入/输出),指对硬盘进行存储和读取的过程。I/O性能越高,则硬盘越优秀,衡量I/O性能可以通过IOPS吞吐量来评估

  • IOPS:指存储设备(HDD、SSD、SAN)单位时间内能处理的IO请求数量,对随机读写频繁的应用,如OLTP数据库、图片、信息,是最关键的衡量指标。IOPS数值受读写比例、随机IO、IO大小、队列深度等因数影响。

  • 吞吐量:
    指单位时间内可以成功传输的数据数量,传输包括读和写的总和。

我们可以用iostat工具来查看系统I/O的状态。

1
2
3
4
5
[root@sds ~]# iostat -d //使用iostat查看磁盘I/O信息
Linux 4.19.7-1.el7.elrepo.x86_64 (sds.ds.vs) 01/22/2019 _x86_64_ (1 CPU)

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.64 2.24 5.24 499641 1167216
  • tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
  • kB_read/s:每秒从设备(drive expressed)读取的数据量;
  • kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
  • kB_read:读取的总数据量;
  • kB_wrtn:写入的总数量数据量;

这些单位都为Kilobytes。

评测磁盘性能

我们采用dd命令来对磁盘进行评测
dd是Linux下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,所以可以用来测试硬盘的顺序读写能力。可以写文件,可以写裸设备。

我们先来了解Linux上两个特殊的设备

  • /dev/null:无底洞,它等价于一个只写文件. 所有写入它的内容都会永远丢失,不产生写磁盘IO
  • /dev/zero:只产生空字符流,对它读取不会产生IO

dd语法:
dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=<字节数>][if=<文件>][obs=<字节数>][of=<文件>][seek=<区块数>][skip=<区块数>][--help][--version]

  • bs=<字节数> 将ibs( 输入)与obs(输出)设成指定的字节数。
  • cbs=<字节数> 转换时,每次只转换指定的字节数。
  • conv=<关键字> 指定文件转换的方式。
  • count=<区块数> 仅读取指定的区块数。
  • ibs=<字节数> 每次读取的字节数。
  • if=<文件> 从文件读取。
  • obs=<字节数> 每次输出的字节数。
  • of=<文件> 输出到文件。
  • seek=<区块数> 一开始输出时,跳过指定的区块数。
  • skip=<区块数> 一开始读取时,跳过指定的区块数。
  • –help 帮助。
  • –version 显示版本信息。

dd常用命令:

  • 测试磁盘写能力:
    time dd if=/dev/zero of=/test bs=64k count=4k oflag=dsync
  • 测试硬盘读能力:
    time dd if=/dev/sdb1 of=/dev/null bs=8k

内存

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。

free命令查看内存状况

1
2
3
4
[root@sds ~]# free -m //查看主机内存状况并以MB为单位
total used free shared buff/cache available
Mem: 985 100 174 55 710 677
Swap: 1023 0 1023
  • total:物理内存大小,就是机器实际的内存
  • used:已使用的内存大小,这个值包括了 cached 和 应用程序实际使用的内存
  • free:未被使用的内存大小
  • shared:共享内存大小,是进程间通信的一种方式
  • buffers:被缓冲区占用的内存大小
  • cached:被缓存占用的内存大小

查看内存是否真实

原理:对内存进行数据写入到上限

  • 手动写入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@sds ~]# cd /dev/shm //进入内存目录
    [root@sds shm]# dd if=/dev/zero of=./memtest bs=1M count=300 //写入300MB内存
    300+0 records in
    300+0 records out
    314572800 bytes (315 MB) copied, 0.462135 s, 681 MB/s
    [root@sds shm]# rm ./memtest //删除测试文件
    rm: remove regular file ‘./memtest’? y
    [root@sds shm]# dd if=/dev/zero of=./memtest bs=1M count=990 //写入990MB内存
    dd: error writing ‘./memtest’: No space left on device //内存不足
    493+0 records in
    492+0 records out
    516726784 bytes (517 MB) copied, 0.751254 s, 688 MB/s
  • 脚本测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ultra ~]# chmod +x ./memtest_10M_64
[root@ultra ~]# ./memtest_10M_64
You have 3 seconds to quit (Ctrl+C)
10MB allocated
20MB allocated
30MB allocated
40MB allocated
50MB allocated
……
……
……
440MB allocated
450MB allocated
460MB allocated
470MB allocated
480MB allocated
Killed

CPU

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。对于CPU评测较为直观的有频率,核心数,线程

我们一般使用lscpu命令查看CPU的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@sds ~]# lscpu
Architecture: x86_64 //cpu架构
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian //小尾序
CPU(s): 1 //逻辑CPU个数
On-line CPU(s) list: 0
Thread(s) per core: 1 //每个cpu核的线程
Core(s) per socket: 1 //每个cpu的核数
Socket(s): 1 //CPU插槽数量
NUMA node(s): 1
Vendor ID: GenuineIntel //cpu厂商id
CPU family: 6 //cpu系列
Model: 94 //型号
Model name: Intel(R) Xeon(R) CPU E3-1230 v5 @ 3.40GHz //cpu名词
Stepping: 3 //步进
CPU MHz: 3408.000 //CPU频率
BogoMIPS: 6816.00
Hypervisor vendor: KVM //虚拟监视器版本
Virtualization type: full //支持的虚拟化技术
L1d cache: 32K //一级数据缓存
L1i cache: 32K //一级指令缓存
L2 cache: 4096K //二级缓存
NUMA node0 CPU(s): 0
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arch_capabilities

综合性能评测工具

  • bench.sh:脚本一键查看设备信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    [root@vultr ~]# wget -qO- bench.sh | bash //下载bench.sh并运行
    -------------------------CPU和内存信息-------------------------------------------
    CPU model : Intel Core Processor (Haswell, no TSX, IBRS)
    Number of cores : 1
    CPU frequency : 2399.996 MHz
    Total size of Disk : 20.0 GB (1.2 GB Used)
    Total amount of Mem : 487 MB (76 MB Used)
    Total amount of Swap : 0 MB (0 MB Used)
    System uptime : 1 days, 2 hour 27 min
    Load average : 0.00, 0.01, 0.04
    OS : CentOS 7.6.1810
    Arch : x86_64 (64 Bit)
    Kernel : 3.10.0-957.1.3.el7.x86_64
    ----------------------------I/O读写速度查询---------------------------------------
    I/O speed(1st run) : 447 MB/s
    I/O speed(2nd run) : 472 MB/s
    I/O speed(3rd run) : 479 MB/s
    Average I/O speed : 466.0 MB/s
    ----------------------------下载带宽测试------------------------------------------
    Node Name IPv4 address Download Speed
    CacheFly 205.234.175.175 154MB/s
    Linode, Tokyo, JP 106.187.96.148 10.2MB/s
    Linode, Singapore, SG 139.162.23.4 7.05MB/s
    Linode, London, UK 176.58.107.39 18.2MB/s
    Linode, Frankfurt, DE 139.162.130.8 15.6MB/s
    Linode, Fremont, CA 50.116.14.9 30.2MB/s
    Softlayer, Dallas, TX 173.192.68.18 56.0MB/s
    Softlayer, Seattle, WA 67.228.112.250 32.6MB/s
  • UnixBench:类unix系统综合性能测试工具
    UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能。Unixbench的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能。相关测试项目的详细说明可以去Unixbench的github主页进行了解:Unixbench

网络

评测网络情况的指标主要有延迟,丢包率,带宽。影响他们的变量主要有距离和线路质量。

  • 延迟:在传输介质中传输所用的时间,即从报文开始进入网络到它开始离开网络之间的时间。越低越好
  • 丢包率:测试中所丢失数据包数量占所发送数据组的比率。越低网络越稳定
  • 带宽:网络带宽是指在单位时间内能传输的数据量。越大网路越快

使用ping命令测试延迟和丢包率

  1. 使用在线工具多个地点ping

2.本地ping测试
除了直接在cmd中使用ping + ip进行测试外,这里推荐一个工具winmtr
该工具将ping和traceroute功能集合在了一起,十分强大。
winmtr-ui

*  Hostname:到目的服务器要经过的每个主机IP
* Nr:经过节点的数量;以上图百度为例子:一共要经过10个节点,其中第一个是出口的路由器
* Loss%:当前节点ping 数据包回复失败的百分比;
* Sent:已传送的数据包数量
* Recv:成功接收的数据包数量
* Best:回应时间的最小值
* Avrg:平均回应时间
* Worst:回应时间的最大值
* Last:最后一个数据包的回应时间

使用speedtest-cli测试服务器带宽

speedtest-cli是利用python写的一个测试带宽的程序,使用它可以从它部署在全球的节点中下载测试文件并上传以此来测试网站带宽
想要更多了解该程序可以去其github主页:传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ip-172-31-22-146 ec2-user]# yum -y install epel-release //安装epel开放环境
[root@ip-172-31-22-146 ec2-user]# yum install python-pip //安装pip
[root@ip-172-31-22-146 ec2-user]# pip install speedtest-cli //使用pip安装 speedtest-cli
[root@ip-172-31-22-146 ec2-user]# speedtest-cli //运行
Retrieving speedtest.net configuration...
Testing from Amazon.com (34.220.178.241)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Pocketinet Communications (Walla Walla, WA) [109.65 km]: 9.048 ms
Testing download speed................................................................................
Download: 556.79 Mbit/s //下载速度
Testing upload speed................................................................................................
Upload: 511.23 Mbit/s //上传速度

挑选好线路的服务器

网络世界中进行数据传输,并非直接将数据端到端直接传输的。而是将数据在传输层分割后在网络层经过不同的网络节点层层传输到目标主机的传输层并重组完成的。这一方面的知识,可以了解一下OSI网络传输模型。
而节点线路的好坏,就直接影响到了我们服务器网络质量的好坏。
对于节点线路的评测,一般来说考虑的就是距离线路质量两个方面

影响网络质量的两大因素

距离:直连还是绕路?
顾名思义,距离指的就是数据从源主机到目标主机经过的距离。这里的距离并非只物理距离,而指的是数据经过的距离。因为数据的传输需要经过网络节点,而有些数据走的网络线路并非就近,而是选择了“绕路”。像下图这样的,明明俄罗斯到中国如此之近,却非要走“水路”横跨太平洋连接,这样一来,延迟就上去了。
direct

线路质量:路宽跑得快
数据传输除了离得近,跑得快外。线路质量也是一重大影响因素,走上了优质的线路,数据在传输途中也不至于拥堵了。国内一般来说CN2线路是比较好了,而其中的CN2 GIA又是更优秀的线路。

  • CN2:Chinatelecom Next Carrier Network(中国电信下一代承载网),相比传统的163骨干网具有具有高弹性,高冗余性和低延迟的特点。 旗下有GT和GIA两条线路
    • GT:即CN2旗下的global transit线路。CN2 GT到中国国际出口拥有自己的单独线路,但是进入国内的还是使用的163出口。
    • GIA:即CN2旗下的Global Internet Access线路,无论国际进口还是出口都接入CN2线路,等级最高,延迟最低。
      中国移动和中国联通的线路由于规模不大,海外接入少。一般来走他们的商家比较少,质量也一般

路由追踪:追踪数据传输过程

我们可以通过路由追踪(tracroute)来追踪数据的传输过程,并以此来判断服务器在网络传输中走的线路。关于路由追踪的原理,感兴趣的可以去看文末的知识扩展

去程的追踪我们依旧利用winmtr这个软件就可以完成:
winmtr-ui
根据这张图片我们可以看出来:这个服务器位于乌克兰,我们的数据从大陆发出,在国内经由CN2骨干线路,绕过太平洋,来到美国西海岸,最终汇入乌克兰。嗯,饶了好一大圈

回城的追踪我们需要在服务器上进行traceroute才能够追踪到:
利用的是mtr这个工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@debian:~# yum install mtr //安装mtr
root@debian:~# mtr 220.166.2.193 //使用mtr ping地址并追踪路由
HOST: debian Loss% Snt Last Avg Best Wrst StDev
1.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
2.|-- lax1-6-1.it7.net 0.0% 10 4.9 2.9 0.7 6.6 2.2
3.|-- lax1-fatpipe-1.it7.net 0.0% 10 1.4 3.3 0.3 9.0 3.3
4.|-- 96.44.163.153.static.quad 0.0% 10 0.8 1.4 0.3 6.1 1.9
5.|-- 218.30.48.145 0.0% 10 2.4 5.0 1.0 12.0 4.3
6.|-- 59.43.182.78 0.0% 10 155.8 156.6 153.0 172.0 5.8
7.|-- 59.43.244.130 0.0% 10 166.3 160.5 155.8 178.3 6.9
8.|-- 202.97.39.138 0.0% 10 156.4 161.0 153.3 214.5 18.8
9.|-- 202.97.91.165 0.0% 10 166.2 163.1 153.5 191.1 11.0
10.|-- 202.97.36.222 0.0% 10 190.2 192.8 188.8 199.9 3.9
11.|-- 171.208.199.26 0.0% 10 194.8 197.3 191.7 220.4 8.5
12.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0

这就是从乌克兰发出的数据辗转来到我们的主机的数据过程了。
我们可以看到回程在国内也是走的CN2线路,这也叫做双向CN2
我们在选购主机时面对宣传的CN2线路注意甄别时单向的还是双向的。

口碑

服务器也是一种商品,因此选购的时候需要注意一下商家平日累积的口碑如何。像是有无砍单,逐渐将配置缩水,超售等。大家可以去主机论坛交流,或者问问身边的朋友。当然最直接的方法还是自己亲自交上学费去试水了。

扩展阅读

漫谈网络通信——从OSI网络模型到TCP/IP协议
路由追踪Traceroute分析与科普
MTR工具使用说明与结果分析
dd测试硬盘性能
Linux命令详解—-iostat
磁盘阵列RAID原理、种类及性能优缺点对比