高级运维工程师在线评测:http://www.gtalent.cn/exam/interview/nsYteJ5wFfWkMdb2
1. 你有用过哪些监控
a. Zabbix
Zabbix 是一个基于 WEB 界面的提供分布式系统监控以及网络监控功能的企业级开源运维平台,也是目前国内互联网用户中使用最广的监控软件。
b. prometheus
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库( TSDB )。
Prometheus 目前在开源社区相当活跃。
Prometheus 和 Heapster ( Heapster 是 K8S 的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。
Prometheus 性能也足够支撑上万台规模的集群。
c. Nagios
Nagios 原名 NetSaint ,是一款开源的企业级监控系统,于1999年推出,由 Ethan Galstad 开发并维护至今。
Nagios 能够实现对系统 CPU、磁盘、网络等方面参数的基本系统监控,而且还能监控包括SMTP,POP3,HTTP,NNTP 等各种基本的服务类型。
另外通过安装插件和编写监控脚本,用户可以实现应用监控,并针对大量的监控主机和多个对象部署层次化监控架构。
d. Cacti
Cacti 是一套完整的网络流量监测图形分析解决方案,基于 RRDTool 的数据存储和图形功能实现网络监控。
2. zabbix 是怎么实现监控这个流程的
创建主机组
创建主机并加入主机组
创建监控项
告警触发器配置
配置告警动作
a. 基本概念
zabbix 最重要的五个组成部分:Item、Trigger、Action、Media、User(其实应该还有个Event,不过这个表现的不直观),翻译一下就是监控元素、触发器、动作、报警介质、用户,接下来一个一个的详谈,最后在梳理他们之间的关系。
Item:监控项,你需要监控的内容
Trigger: 触发器,你监控的内容满足什么条件时报警
Action: 动作,触发器出发时怎么告警
Media: 告警媒介,告警采用什么方式
User: 用户是什么用户
b. 流程图
Zabbix 监控过程是这样的:安装在主机上的 zabbix_agentd 负责监控主机(具体的监控任务是由 agentd端的 Item来完成的),并收集数据,然后将数据发送到 zabbix server 端。如果是分布式系统,需要监控的机器较多,为了减轻 server 端的压力,可能中间还会再搭建一个 proxy 端,用来暂时接收监控数据,然后将数据转发到 server 端。Server 端将数据存储到数据库中,zabbix web 再将数据在前端以图表或者文字的形式展现出来。
3. zabbix是怎么实现报警的
触发器
表达式,如果内存不足** 300M** ,用户超过 30 个等
当出发条件发生后,会导致一个触发条件
触发事件会执行某个动作
动作
触发器的条件被触发后的行为
可以是发送邮件,也可以是重启某个服务
4. zabbix的数据收集,日志收集,你是用的什么
事前及时预警发现故障,事后提供详实的数据用于追查定位问题
5. ELK 是一套什么东西
ELK 是 **Elasticsearch、Logstash、Kibana ** 三大开源框架首字母大写简称。
其中 Elasticsearch 是一个基于 ** Lucene**、分布式、通过 ** Restful ** 方式进行交互的近实时搜索平台框架。
像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch 作为底层支持框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们简称 Elasticsearch 为 es 。
Logstash 是 ELK的中央数据流引擎,用于从不同目标(文件/数据存储/ MQ )收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ / redis / elasticsearch / kafka 等)。
Kibana 可以将 elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能
6. 当磁盘满了的时候,你是怎么获取到的这个信息
使用 zabbix 监控磁盘容量,在容量 80% 的时候设置个阈值。
当容量达到阈值就自动报警,可以通过发送短信或邮件进行通知。
7. docker,k8s了解吗
docker
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 主要有如下几个概念:
引擎:创建和管理容器的工具,通过读取镜像来生成容器,并负责从仓库拉取镜像或提交镜像到仓库中;
镜像:类似于虚拟机镜像,一般由一个基本操作系统环境和多个应用程序打包而成,是创建容器的模板;
容器:可看作一个简易版的 ** Linux ** 系统环境(包括 root 用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子;
仓库:集中存放镜像文件的场所,分为公共仓库和私有仓库,目前最大的公共仓库是官方提供的 **Docker Hub ** ,此外国内的阿里云、腾讯云等也提供了公共仓库;
宿主机:运行引擎的操作系统所在服务器。
k8s
它是一个工业级的容器编排平台。它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的。
Kubernetes 有如下几个核心的功能:
服务的发现与负载的均衡;
容器的自动装箱,就是“调度”,把一个容器放到一个集群的某一个机器上,**Kubernetes **会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;
**Kubernetes **会帮助我们去做自动化的容器的恢复。在一个集群中,经常会出现宿主机的问题或者说是 OS 的问题,导致容器本身的不可用,Kubernetes 会自动地对这些不可用的容器进行恢复;
Kubernetes 会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;
对于 job 类型任务,**Kubernetes **可以去做批量的执行;
为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
Kubernetes 架构是一个比较典型的 二层架构和 server-client 架构。
Master 作为中央的管控节点,会去与Node 进行一个连接。
所有 U I 、clients这些user侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。
核心概念
第一个概念:Pod
Pod是 Kubernetes的一个最小调度以及资源单元。用户可以通过Kubernetes 的Pod API 生产一个Pod,让Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个** Pod** 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。
第二个概念:Volume
Volume就是卷的概念,它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
第三个概念:Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组Pod 的副本数目、以及这个Pod 的版本。一般大家用Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成Deployment 最小的单元。
第四个概念:Service
Service 提供了一个或者多个 Pod 实例的稳定访问地址。
第五个概念:Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。
8. docker怎么查看容器的信息
docker inspect 看到容器的源数据、容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置
9. 当一个服务崩溃了,你会怎么去排查
首先简单排查物理设备,网线是否完好,也可用 netstat ,netstat -i显示网卡列表信息,netstat -s 显示网络统计信息
查看开机信息,/var/log/dmesg , /var/log/boot.log dmesg 命令用于显示开机信息。kernel会将开机信息存储在 ring buffer 中。您若是开机时来不及查看信息,可利用 dmesg来查看。开机信息亦保存在 /var/log 目录中,名称为 dmesg 的文件里
查看系统操作日志 /var/log/ messages ,检查系统或在哪个用户进行了哪些操作
iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况。要特别注意 iostat 统计结果中的
%iowait 值,太大了表明你的系统存储子系统性能低下
%user:CPU处在用户模式下的时间百分比
%nice:CPU处在带NICE值的用户模式下的时间百分比
%system:CPU处在系统模式下的时间百分比
%iowait:CPU等待输入输出完成时间的百分比
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle:CPU空闲时间百分比
top,cat /proc/meminfo 也可观察服务器运行情况,哪些进程过大,看看是否因为内存不足而杀死了一些进程
10. python 中装饰器,生成器,迭代器解释一下
装饰器: 给函数增加新功能,不修改被装饰对象的源代码和调用方法
生成器: 生成器其实是一种特殊的迭代器,它不需要__iter__() 和__next__() 方法,只需要一个yiled 关键字
迭代器: 任何实现了__iter__() 和__next__() 方法的对象都是迭代器,iter() 返回迭代器自身, next() 返回容器中的下一个值
11. python算法知道哪些,讲一个你熟悉的
def bin_search(data_list, val):
low = 0 # 最小数下标
high = len(data_list) - 1 # 最大数下标
while low <= high:
mid = (low +high) //2 # 中间数下标
if data_list[mid] == val: # 如果中间数下标等于val, 返回
return mid
elif data_list[mid] > val: # 如果val在中间数左边, 移动high下标
high = mid - 1
else: # 如果val在中间数右边, 移动low下标
low = mid + 1
return # val不存在, 返回None
ret =bin_search(list(range(1, 10)), 3)
print(ret)
12. python中线程池和进程池的区别
使用 **ProcessPoolExecutor **进程池,使用 ThreadPoolExecutor 线程池,都提供异步调用。
进程池是由服务器预先创建的一组子进程,一般来说这些子进程的数目在** 3~10** 个之间。
线程池中的线程数量应该和 ** CPU** 数量差不多。
线程池主要用于
需要大量的线程来完成任务,且完成任务的时间比较短。
应用场景:WEB 服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,一个热门网站的点击次数会很多。但对于长时间的任务,比如一个Telnet 连接请求,线程池的优点就不明显了。因为 Telnet 会话时间比线程的创建时间大多了。
对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。
进程池中的所有子进程都运行着相同的代码,并具体相同的属性·,比如优先级、**PGID **等。
当有新的任务到来时,调用过程如下:
主进程使用某种算法(比如随机算法、轮流算法)来主动选择子进程。
主进程和所有子进程通过一个共享的工作队列来同步,子进程睡眠在工作队列上,当有新任务到来时,会唤醒一个正在等待任务的拥有接管权的子进程,它从工作队列中取出任务并执行,而其他子进程将继续睡眠。
13. 你在哪里用到了线程池,为什么要用线程池,结合你实际用到的场景说一下
服务器创建和销毁工作线程的开销很大,如果服务器与很多客户端通信,并且与每个客户端通信的时间很短,那么就会在创建和销毁线程的时候造成很大的开销。
线程池中预先创建了一些工作线程,他们不断的从工作队列中取出任务,然后执行,当执行完之后,会继续执行工作队列中的下一个任务,减少了创建和销毁线程的次数,每个线程都可以一直被重用,避免了创建和销毁的开销。另外,可以根据系统的实际承载能力,方便的调节线程池中线程的数目,防止因为消耗过量的系统资源而导致系统崩溃的问题。
线程池在系统启动时会创建大量空闲的线程,当线程对象传递给线程池之后,线程池就会启动其中一个线程来执行该对象的 ** run ** 或者 call 方法。执行完毕后,该线程并不会消亡,而是返回线程池,变成空闲状态。等待执行下一个 ** run **或者 **call ** 方法。
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
运用线程池能有效的控制线程最大并发数,可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约 **1MB ** 内存,线程开的越多,消耗的内存也就越大,最后死机)。
对线程进行一些简单的管理,比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现
14. 全局锁解释一下,为什么会有全局锁
像 C、**java ** 等编译型语言,程序输入到编译器后,编译器会根据语法进行解析,翻译成机器码,编译器可以深层次的对代码进行优化;而 ** python ** 是解释性语言,程序输入到解释器,解释器在执行程序之前对程序并不了解,因此对 ** python ** 程序的优化其实是对解释器的优化。在 ** python **多线程编程时,解释器需要避免不同的线程操作的内部共享数据,同时要保持计算资源的最大化,这样就需要全局锁,也叫全局解释锁,简单来说就是一个互斥锁,这样只允许一个线程控制 ** python ** 解释器。
实际上对于 ** python 的多线程编程,在程序运行时 ** python 解释器只会运行一个线程,无论**CPU ** 是多少核,多少线程,只会有一个线程去控制解释器
对于 CPU 密集型操作适合使用多进程编程,对于 **IO ** 密集型操作适合使用多线程编程
15. django的中间件你有用过哪一些
CommonMiddleware
限制 settings.DISALLOWED_USER_AGENTS 中指定的请求头来访问本网站
XFrameOptionsMiddleware
做了clickjacking攻击的保护。clickjacking 保护是攻击者在自己的病毒网站上,写一个诱惑用户点击的按钮,然后使用iframe的方式将受攻击的网站(比如银行网站)加载到自己的网站上去,并将其设置为透明的,用户就看不到,然后再把受攻击的网站(比如银行网站)的转账按钮定位到病毒网站的按钮上,这样用户在点击病毒网站上按钮的时候,实际上点击的是受攻击的网站(比如银行网站)上的按钮,从而实现了在不知不觉中给攻击者转账的功能。
假设一个在线商店拥有一个页面,已登录的用户可以点击“现在购买”来购买一个商品。用户为了方便,可以选择一直保持商店的登录状态。一个攻击者的站点可能在他们自己的页面上会创建一个“我喜欢Ponies”的按钮,并且在一个透明的iframe中加载商店的页面,把“现在购买”的按钮隐藏起来覆盖在“我喜欢Ponies”上。如果用户访问了攻击者的站点,点击“我喜欢Ponies”按钮会触发对“现在购买”按钮的无意识的点击,不知不觉中购买了商品。
类AuthenticationMiddleware
将user代表当前登录用户的属性添加到每个传入HttpRequest对象
类PersistentRemoteUserMiddleware
仅在登录页面上启用时,用于利用Web服务器的中间件提供了身份验证
CSRF保护中间件
CsrfViewMiddleware
通过向POST表单添加隐藏的表单字段并检查请求的正确值来增强对跨站点请求伪造的保护
SessionAuthentication
session中间件。会给request添加一个处理好的session对象。
处理跨域请求
corsheaders.middleware.CorsMiddleware
https://github.com/adamchainz/django-cors-headers
16. django的优化有没有做过,前端怎么优化,后端怎么优化
后端 之前用的模板语言 现在用的 **drf **
前端 之前只是普通的 ** h5 ** 页面 现在用的 **vue **
前后端使用 ** drf api** 接口用过 Vue ajax 将数据拿回来
17. 用户发出一个请求,django 是怎么接收的
用户通过浏览器请求一个页面
请求到达** Request Middlewares** ,中间件对** request ** 做一些预处理或者直接 response请求
URLConf 通过** urls.py ** 文件和请求的 **URL **找到相应的 ** View **
**View Middlewares ** 被访问,它同样可以对 **request ** 做一些处理或者直接返回 **response **
调用 View 中的函数
**View ** 中的方法可以选择性的通过 **Models ** 访问底层的数据
所有的 ** Model-to-DB ** 的交互都是通过 manager 完成的
如果需要,Views 可以使用一个特殊的 **Context **
Context 被传给 **Template ** 用来生成页面
Template 使用 ** Filters ** 和 Tags 去渲染输出
输出被返回到 ** View **
HTTPResponse 被发送到 **Response Middlewares **
任何 ** Response Middlewares ** 都可以丰富 ** response** 或者返回一个完全不同的 **response **
Response 返回到浏览器,呈现给用户
18. 解释一下 MTV
所谓的 MTV (** Model–Template–View** ),翻译一下就是模型、模板、视图。
一般是用户通过浏览器向我们的服务器发起一个请求**(request)**,
这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django 的 MTV 模式
Django 的 ** MTV **模式的本质和 ** MVC ** 是一样的,也是为了各组件间保持松耦合关系,只是定义有些不同,
Django 的 MTV 分别是
M 代表模型 (Model) 负责业务对象和数据库的关系映射 (ORM)
**T ** 代表模板 (Template) 负责如何把页面展示给用户 (html)
V 代表视图 (View) 负责业务逻辑 并在适当时候调用 Model 和 ** Template **
除了以上三层外,还需要一个** URL** 分发器、他的作用是将一个个 **URL ** 的页面请求分发给不同的 **View **处理,**web **服务器(中间件)收到一个 ** http ** 请求
**Django ** 在 **URLconf ** 里查找对应的视图 (view) 函数来处理 **http ** 请求
视图函数调用相应的数据模型来存储数据、调用相应的模板向用户展示页面
视图函数处理结束后返回一个 ** http ** 的相应给 **web ** 服务器
**web ** 服务器将响应发送给客户端
MTV 的响应模式如下
中间件接收到一个 ** http ** 请求
django 在 url 路由系统中查找对应的视图来处理 ** http ** 请求
视图函数调用对应的 **model ** 模型来存储数据、调用相应的模板来展示页面
19. 你用django做了一个什么系统平台
一个简单的博客平台,可以在该系统上实现简单的登录注册注销动作,可以在平台上发布自己的文章并且有热度排行,还可以对自己的文章进行增删改查的功能
一个简单的资产管理系统,将公司的服务器,内存,硬盘网卡等固定资产信息统一放在一个平台内,可以通过点点点的方式查看资产信息
20. linux 的内核优化有没有做过,具体是优化什么
主要是指在 ** Linux** 系统中针对服务应用而进行的系统内核参数调整,优化没有的标准
根据实际需求优化才是最合适的
编辑内核配置文件
参数及简单说明
生效配置
具体如下
登录系统:不使用 root 登录,通过 **sudo ** 授权管理,使用普通用户登录。
禁止 ** SSH ** 远程:更改默认的远程连接 SSH 服务及禁止 **root ** 远程连接。
时间同步:定时自动更新服务器时间。
配置 ** yum ** 更新源,从国内更新下载安装 ** rpm** 包。
关闭 ** selinux ** 及 ** iptables** ( iptables 工作场景如有 wan ip,一般要打开,高并发除外)
调整文件描述符数量,进程及文件的打开都会消耗文件描述符。
定时自动清理 ** /var/spool/clientmquene/** 目录垃圾文件,防止节点被占满(c6.4 默认没有sendmail,因此可以不配。)
精简开机启动服务(crond、sshd、network、rsyslog)
Linux 内核参数优化 ** /etc/sysctl.conf** ,执行 sysct -p 生效。更改字符集,支持中文,但是还是建议使用英文,防止乱码问题出现。
锁定关键系统文件(chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 处理以上内容后,把 **chatter **改名,就更安全了。)
清空** /etc/issue ** ,去除系统及内核版本登陆前的屏幕显示。
21. 前端的框架你有用过哪些?有没有用过Vue
前端框架用过 ** react** 和 ** vue **。
vue概述(可以从以下几点说):
虚拟dom,页面渲染过程
element-admin后台管理系统
父子组件传值
vue路由
22. tcp 和 udp 的区别
**TCP ** 和 **UDP **是 **OSI **模型中的传输层中的协议。**TCP ** 提供可靠的通信传输,而 ** UDP ** 则常被用于让广播和细节控制交给应用的通信传输。
**TCP **与 **UDP ** 区别总结:
TCP 面向连接(如打电话要先拨号建立连接); **UDP **是无连接的,即发送数据之前不需要建立连接
TCP ** 提供可靠的服务。也就是说,通过 ** TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达; ** UDP** 尽最大努力交付,即不保证可靠交付
TCP 面向字节流,实际上是 TCP ** 把数据看成一连串无结构的字节流; UDP 是面向报文的UDP** 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
每一条 TCP 连接只能是点到点的; UDP 支持一对一,一对多,多对一和多对多的交互通信
**TCP **首部开销 **20 **字节(包括源端口号,目的端口号、序列号、确认号窗口大小、校验和等); UDP ** 的首部开销小,只有 ** 8 个字节(包括源端口号、目的端口号、数据包长度、校验和)
**TCP ** 的逻辑通信信道是全双工的可靠信道, UDP 则是不可靠信道
23. tcp三次握手和四次挥手的区别
四次挥手时,服务器收到释放报文,发出确认报文** ACK=1**,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态 。
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
当客户端收到服务器的确认请求后,客户端进入** FIN-WAIT-2** (终止等待2)状态,等待服务器发送连接释放报文,等待过程中还要接受服务器发送的最后数据
数据发送完毕后,服务器就会向客户端发送连接释放报文,**FIN=1,ack=u+1**, 此时,服务器就进入了**LAST-ACK**(最后确认)状态,等待客户端的确认。
24. 四次挥手中为什么会多了一个time_wait
在客户端发送第四次挥手后,等待** 2MSL** ,进入** CLOSE ** 状态
确保最后一个确认报文能够到达。如果没能到达,服务端就会会重发FIN请求释放连接。等待一段时间没有收到重发就说明服务的已经** CLOSE ** 了。如果有重发,则客户端再发送一次LAST ack 信号
等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文
25. 工作过程中有经常遇到过哪些故障
26. CICD 流程讲一下,并且使用 ansible 部署更新了多少台服务器
27. jenkins主要做了什么
Jenkins 的主要目标是:监控软件开发流程,快速显示问题,保证开发人员以及相关人员省时省力提高开发效率。**CI **系统在整个开发过程中的主要作用是控制:当系统在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么 CI 系统将通知相关人员,然后继续监视存储库。它的角色看起来是被动的;但它确能快速反映问题。
CI 从远程仓库拉取代码到jenkins中集成,CD 将集成好的代码部署到生产环境
28. 你做的监控平台监控了哪些指标
监控项目 详细内容
主机监控 ** CPU**,内存,磁盘的剩余空寂按/利用率和I/O,swap使用率。系统up时间,进程数,负载
网卡监控 ping的往返时间及包成功率,网卡流量,包括流入、流出量和错误的数据包数
文件监控 监控文件大小,hash值,匹配查询,字符串存在否
url监控 检测指定url访问过程中的返回码,下载时间及文件大小,支持内容匹配
应用程序 端口和内存使用率,cpu使用率,服务状态,请求数,并发连接数,消息队列的字节数,client事务处理数,service状态
数据库 检测数据库中指定表空间,数据库的游标数,session数,事务数,死锁数,缓冲池命中率,库擦车命中率,当前连接数,进程的内存利用率等性能参数
日志 错误日志匹配,特定字符串匹配
硬件 温度,风扇转速,电压
【王老师说运维】:运维之linux基础入门实战(http://www.codeforest.cn/course/443)