宣布一个事情,那就是我找到工做了!html
仍是作openstack的,我比较欣慰,我不知道本身适不适合作openstack,可是我确定不喜欢作7*24的系统运维,我一点都不喜欢加班,我更加鄙视值夜班。也许就是命吧,经历那么屡次面试,能进入实习公司学习openstack,虽然我离开了99,可是我以为作这门会比其余运维好多了,学习压力至少少了一部分,什么各类乱七八糟的数据库我也不用太花时间了,各类复杂的应用服务器软件我也许不须要管。个人重点就是openstack和python,甚至ansible或salt,再用一些Linux基本的服务软件和shell,如今对我这个应届生来讲,最大的困难就是服务器硬件设备自己了,这一点我有点难搞!python
此次我进的是南京一个很小的创业公司,去年才成立,不是我没有野心去幻想大公司了,而是遭遇到了失败,或者说此时的心气已经没了。在面小公司以前,春招我也面过苏宁,上午很easy,下午一个是笑都不笑的面庞,表现不好,算了吧,进不去就进不去,我也不想作那种没完没完了的工做。若是小公司发展好了,我就是元老,几年后也就是技术总监,若是发展很差就会倒闭,我就又要找工做了,我必定要有随时准备面试的意识呀,我怕到时候压力一来,没作准备,容易扛不住!如今看来,运维真的是一个屌丝行业,运维开发才是主流,趁还有时间,我这python必须好好学了。mysql
有段时间没写博客了,其实这篇面经也是整理好久了,不知道为何我比较懒,如今才发出来,签了三方协议后,说玩也没有玩,反正就是偏向实践的学习了,理论方面有些放松。之后上班了就再也不是系统的学习,而是遇到问题再学习,那时候的压力和急性子就是让人失望了。linux
不知道接下来还会遇到什么坎,但愿勤于思考吧...
nginx
一、求10次之内的斐波那契数列,初始值是0程序员
答:web
def foo(list,num):面试
if num == 1:算法
list.append(0)sql
elif num == 2:
foo(list,1)
list.append(1)
elif num > 2:
foo(list,num-1) ##从10一直遍历到0为止,才执行下一句话
list.append(list[-1]+list[-2]) ##从倒数第1个,倒数第2个
mylist = []
foo(mylist,10)
print (mylist) ##输出[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
二、合并两个有序列表?
答:思想就是制造空列表,再填数据,这个方法我记得最熟了
list1 = [1,3,5]
list2 = [2,4,6,8]
temp = []
for i in range(len(list1)):
if list1[i] not in temp:
temp.append(list1[i])
for j in range(len(list2)):
if list2[j] not in temp:
temp.append(list2[j])
temp.sort() ##这里就不须要赋值了
print ("合并后的列表是",temp)
三、列表和字符串如何相互转换?
答:>>> str1 = 'abcdef'
>>> list(str1)
['a', 'b', 'c', 'd', 'e', 'f']
>>> mylist = list(str1)
>>> ''.join(list(mylist)) ##引号之间不加任何东西,结果就直接粘在一块儿,注意有一个点,点与单引号之间没有空格
'abcdef'
>>> '->'.join(list(mylist)) ##单引号之间加入任意字符,那么字符串结果就是以链接符构成的
'a->b->c->d->e->f'
四、分析a、b、c、d的值?
>>> a = [1, 2, 3, 4, ['a', 'b']]
>>> b = a ##赋值,就是把a对象的引用(地址)传给b,b至关因而a的标签
>>> import copy
>>> c = copy.copy(a) ##浅拷贝:只拷贝外围的对象的值,意思说外围值不会发生变化,之后内围对象的值随a的变化而变化
>>> d = copy.deepcopy(a) ##深拷贝,外围对象和內围对象的值都进行拷贝,之后都不会发生变化。
>>> a.append(5)
>>> a[4].append('c')
答:>>> print ('a = ', a)
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print ('b = ', b)
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print ('c = ', c)
c = [1, 2, 3, 4, ['a', 'b', 'c']]
>>> print ('d = ', d)
d = [1, 2, 3, 4, ['a', 'b']]
五、select、poll、epoll之间的区别?(反正我是记不住的)
答:select的几大缺点:
(1)每次调用select,都须要把fd集合从用户态拷贝到内核态,这个开销在fd不少时会很大
(2)同时每次调用select都须要在内核遍历传递进来的全部fd,这个开销在fd不少时也很大
(3)select支持的文件描述符数量过小了,默认是1024
poll改善了第三个缺点,epoll改善了三个缺点。
参考文档:http://www.cnblogs.com/Anker/p/3265058.html
六、Linux系统的CPU和内存使用率比较高怎么办?(竟然这个问题问开发,果真是大厂,就是叼,就算我运维我一时也拿不出最好的解决办法,这不是一件容易的事情)
答:(1)用top命令查看哪一个进程占用CPU高,[root@python ~]# top -b -n 1 >top.txt ## -b bacth mode,-n 1次循环
(2)用top -H -p pid命令查看进程内各个线程占用的CPU百分比
(3)查看这个线程全部系统调用所花费时间 strace -p 【线程ID】
(4)使用nice命令下降该进程任务的优先级
参考文档:http://blog.sina.com.cn/s/blog_48eef8410101fl4p.html
七、Linux中进程A可否直接访问进行进程B?为何?(我擦,拓麻这种问题太底层了,不过是操做系统概念,说到linux就反而以为过高深了)
答:显然不能。(1)B进程为避免破坏数据的一致性,可能有互斥锁。(2)A与B的进程通讯须要一些手段如消息队列、共享内存、socket、信号量、管道等实现。(3)A进程的三态(运行、就绪、阻塞)都须要CPU来调度,而调度又有一些算法(先来先服务、最高优先级、最短期优先)才能来实现进程的状态转换,若是进程B在使用CPU,A进程就只能阻塞,那么A进程又怎么能访问B呢。
八、如何实现对cinder进行备份?(这个被问到过,想了半天说快照,其实错了)
答:(1)首先快照不是备份,没有冗余做用,只是用来恢复某个时间点的状态,若是原有卷挂掉,卷也是不能用的。由于快照要求卷是available的(即不能被挂载),因此一旦原有卷作了快照,是不能删除原有卷的,必须先删除其关联的快照才行。在快照的基础上,再进行建立volume(若是基于快照建立了硬盘,快照删除不掉)。快照命令:cinder snapshot-list
参考文档:http://blog.csdn.net/hhp_hhp/article/details/49175101
(2)备份前,卷须要是available状态(即不能被挂载),备份一旦完成,对卷就不具备依赖性。cinder backup-create
(3)使用后端驱动进行备份,好比swift或NFS共享存储,块存储节点写入数据,然后上传到NFS服务端(局域网中的另外一个节点)。
(4)目前Freezer已正式引入OpenStack,可以进行数据库和nova实例、cinder卷的备份。
参考文档:http://www.aixchina.net/Article/159885
九、某公司系统忽然发生访问异常,经程序员排查肯定程序里没有死循环和定时任务等,该线上系统采用的是nginx+tomcat方式部署,如今让你快速分析系统最有可能的异常缘由,后期防范这种异常能够采用什么方案。其余信息和答题要求以下:
(1)该线上系统周一到周五压力较高,周六周日压力较低;
(2)异常发生在周日;
(3)外界只能经过nginx访问到系统,不能经过tomcat直接访问;
(4)系统分配给tomcat的内存被耗尽了;
(5)nginx已经记录了详细的访问日志;
(6)定位异常缘由的主要操做步骤和主要命令写出来;
(7)防范方案的原理和主要命令要写出来
分析:(1)周一周五压力高,说明访问量和负载比较大,用户人群多,可是周末压力很小,异常却发生在周末,说明不是并发链接数受限的问题,nginx和数据库确定还撑得住。
(2)外界只能经过Nginx代理到tomcat,tomcat自身不开放8080端口,这一点是彻底能够的,让tomcat专心处理动态页面
(3)系统分配给tomcat的内存用光了,这句话不太好理解,是说tomcat内存利用率高达95%以上吗?按理说服务器的内存通常都是够的,那么内存使用率很高,不知道CPU使用率高不高,使用top命令查看一下,另外查杀相应的僵死进程。
(4)awk '{arr[$1++]}END {for i in arr {print i ,arr[i]}}' nginx.log 统计nginx每一个IP的访问人数,判断有没有恶意***,另外分析服务
器响应的状态码,这一点多是排错的关键,若是都是200 OK或则304都没啥大问题,。
十、linux下的压力测试工具备哪些?注意事项有什么?
答:(1)webbench、ab:访问web服务器的压力测试
一、压力及性能测试工做应该放到产品上线以前,而不是上线之后;
二、测试时并发应当由小逐渐加大,好比并发100时观察一下网站负载是多少、打开页面是否流畅,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少;
三、更详细的进行某个页面测试,如电商网站能够着重测试购物车、推广页面等,由于这些页面占整个网站访问量比重较大。
备注:webbench 作压力及性能测试时,该软件自身也会消耗CPU和内存资源,为了测试准确,建议将 webbench安装在其余的服务器上,已达到测试数据更加精确
(2)mysqlslap对数据库的并发链接测试、sysbench对磁盘IO进行压力测试,二者能够结合起来。
参考文档:http://www.cnblogs.com/chenmh/p/5866058.html
(3)除了这些以外,还能够说系统性能测试命令,如top、vmstat、free等经常使用命令,其实对于uptime命令我始终没法衡量它的上限达到怎样才算不合适?还有top的CPU使用率描述太混乱了!
(4)ipperf测试网络带宽和丢包率,忽然想起pstree命令是个好东西 ,找父进程,多线程。[root@kvm ~]# yum -y install psmisc 依赖安装pstree
十一、如何在Linux多级目录下,搜索某个关键字?
答:[root@python ppp]# grep -Rn 'mask' ./ ##用grep递归查找,可是find仅仅可以找到该关键字是否存在,暂时不知道如何打印该关键字所在的文件
十二、迭代器和生成器?
答:(1)迭代器(iterator)表明一个数据流对象,不断重复调用迭代器的next()方法能够逐次地返回数据流中的每一项,当没有更多数据可用时,next()方法会抛出异常StopIteration。
(2)生成器(generator)也是一个迭代器,可是你只能够迭代他们一次,不能重复迭代,由于它并无把全部值存储在内存中,而是实时地生成值。Yield是关键字,它相似于return,只是函数会返回一个生成器。对于相似资源的访问控制等场景,生成器显得很实用。其实最好的理解就是,每执行这个函数,yield都会保存结果值,打印的时候所有打印全部结果。
val = False
while not val:
print '这句话的意思是当val变量为假的时候死循环执行!'
def test():
yield "$1000"
1三、zabbix如何去监控一个web服务器的性能?
答:监控指标:(1)打开网页的响应时间(2)每秒的下载速度(3)服务器返回的http状态码(4)验证用户密码登陆是否成功
1四、Python是强类型仍是弱类型的语言?(这个东西我确定要说错)
答:python是强类型。强弱是对类型而言的。强类型,你有一个值以后这个值是什么类型是肯定的,好比n='1',n的类型是肯定的(字符串),所以你不能在Python作n='3'm=n+1运算。而弱类型就不是这样的,值的类型能够在须要的时候再去肯定,好比PHP里面你能够$n='3'; $m=$n+1,运算的时候'3'就能够看成整型来进行计算。
参考文档:https://segmentfault.com/q/1010000002230156
1五、python的动态性体如今哪?
答:(1)定义变量的时候无需指定它的数据类型,根据运行时具体状况肯定。
(2)类class不提供private私有属性的关键字;没法定义常量;函数参数无类型
(3)python中的namespace是能够动态变化的,类的成员,类实例的成员均可以动态添加
1六、python的namespace有几种?
答:(1)locals:函数内部的名字空间,通常包括函数的局部变量以及形式参数。
(2)enclosing function:在嵌套函数中外部函数的名字空间。
(3)globals:当前的模块空间,模块就是一些py文件。也就是说,globals()相似全局变量。
(4)__builtins__: 内置模块空间,也就是内置变量或者内置函数的名字空间。好比len()等函数的命名空间就是BIF命名空间
参考文档:http://www.jianshu.com/p/7f3fdd41096f
1七、awk实现下列文本的转换?
[root@ssd tmp]# cat 5.sh
1
D
2
E
3
V
[root@ssd tmp]# cat 5.sh |awk '{if(NR%2!=0)ORS=" ";else ORS="\n";print}'
1 D
2 E
3 V
1八、怎么实现迭代器?迭代器比for循环有什么优点吗?(这个东西我怎么就记不住呢!)
答:迭代器和经典for循环的索引访问相比并没有优点,反而丢失了索引值(可使用内建函数enumerate()找回这个索引值)。但对于没法随机访问的数据结构(好比set)而言,迭代器是惟一的访问元素的方式。
next方法:返回迭代器的下一个元素
__iter__方法:返回迭代器对象自己
参考文档:http://www.cnblogs.com/kaituorensheng/p/3826911.html
1九、python的三目运算符有吗? 怎么用一行代码实现三目运算?
答:python没有三目运算符。使用If-else能够模拟三目运算
>>> x, y = 50, 25
>>> small = x if x < y else y
>>> small
25
>>>
20、磁盘利用率快用尽时,如何看哪一个目录使用的最多?
答:(1)find命令:find / -type d -size +2G -print
(2)du -sh /etc ##×××了,这个命令没记住,记成df了
2一、python多线程与多进程有何区别?
答:多线程用来并行处理多个任务,以提升处理效率,在python中导入threading模块。join()方法的做用是必须在子线程运行完毕以后,父线程才能运行,即父线程被阻塞,由于若是父线程一旦运行完毕,子线程就不会再运行了。
(1)多线程能够共享全局变量(内存地址空间),固然锁问题也变成麻烦了;多进程独占资源,进程通讯变得就比较麻烦了。
(2)多线程中,全部子线程的线程号相同;多进程中,不一样的子进程进程号不一样
(3)多线程只使用一颗CPU内核,属于IO密集型,好比在读取文件以及网络IO的时候使用多线程;多进程充分发挥多核的优点,属于计算密集型执行任务。
2二、简要说明nova compute建立实例的大致步骤?(这个问题总结不少遍了,可是下面是最简单的描述)
答:(1)nova compute准备建立虚拟机实例的资源,好比根据flavor配置使用多大内存、多少颗CPU、多大磁盘?
(2)nova 从glance下载镜像文件,会对计算节点的_base目录进行缓存
(3)定义实例的XML文件,描述实例的元数据信息,以便下次能够正常启动
(4)nova请求neutron获取虚拟网卡的参数,实例获得诸如IP地址、MAC地址的信息,然后引导虚拟机。
2三、虚拟机迁移如何防止调度到源节点的机制?
答:nova-compute 在作 migrate 的时候会检查目标节点,若是发现目标节点与源节点相同,会抛出 UnableToMigrateToSelf 异常。Nova-compute 失败以后,scheduler 会从新调度,因为有RetryFilter,会将以前选择的源节点过滤掉,这样就能选到不一样的
计算节点了。
2四、计算节点宕机,虚拟机实例还能运行吗?若是不能,怎么恢复呢?
答:虚拟机实例固然不能运行,若是只是nova-compute进程已经挂掉,Rebuild 能够恢复损坏的 instance。
可是计算节点宕机就不行,能够把虚拟机实例撤离到正常的计算节点上去。Evacuate可在 nova-compute 没法工做的状况下将节点上的instance 迁移到其余计算节点上。但有个前提: Instance 的镜像文件必须放在共享存储上。
流程:(只能在后台执行)
执行命令nova evacuate 主机名 --no-shared-storage -> 消息下发到nova-api -> nova-schedule筛选好主机 -> nova-compute分配资源,使用共享存储上的镜像文件 -> 启动instance
参考文档:http://www.mamicode.com/info-detail-1608057.html
2五、网卡绑定的工做模式?(这个问题曾经在去年6月份才学过这点,如今都忘了,只记得3种,并且平衡二字又说不出来)
答:若是不一样主机的网卡绑定的话,交换机也要进行配置链路聚合才行。总共7种,主要3种
(1)平衡模式
(2)主动备份
(3)广播
bond的好处:(1)提升总体带宽(2)负载均衡
参考文档:http://alanwu.blog.51cto.com/3652632/1095566
2六、MySQL 5.5是单线程复制仍是多线程复制?若是有大量的DML语句,如何解决主从延迟同步问题?(卧了个槽,这种
问题历来没思考过,又差点栽在数据库集群上了)
答:mysql从5.6才开始支持多线程复制。DML(一瞬间有点懵逼,反应很久才想起来是数据库操做语言)就是Insert、update等。
呵,我是记获得被思必驰狠狠虐过,固态硬盘作RAID阵列和分库分表记得最熟了。
MySQL的高可用知道多少?MMM、MHA架构熟悉吗?(日了狗,我又不是DBA,只据说过,又没作过)
答:只知道一主多从中,对从集群的HAProxy+Keepalived架构。
2七、Linux Bridge与Open Vswitch有什么区别?(这段时间我没有全身心放在openstack上,知识尚缺,之后还会补充)
答:(1)基于vlan的隔离方式不一样,ovs使用flow rule实现外部vlan以及内部vlan的转换
(2)iptables只能用于linux bridage而非OVS bridge,linux bridge 不支持GRE,但OVS支持。
(3)OVS的patch port用来链接集成网桥br-int和隧道网桥br-tun,而linux bridage使用veth对链接br-int和外部网桥br-eth1
(4)OVS的功能应该强于Linux Bridge,不然官网使用Linux Bridge,可是不少企业都用的是OVS。根据测试结果,Linux Bridge的性能(如网络吞吐量、虚拟之间的文件传输速度)略强于OVS。
(5)OVS 将各类功能都原生地实如今其中,而Linux Bridge依赖各类其余模块来实现各类功能。
参考文档:http://www.cnblogs.com/sammyliu/p/4985907.html
2八、数据包流过OVS的过程?(先来个很简单的印象吧,其实OVS的不少桥仍是比较麻烦的,脑袋里必定要想那个拓扑图)
答:1 VM实例instance的网络协议栈产生一个数据包并发送至实例内的虚拟网络接口VNIC,就是instance中的eth0.
2 这个数据包会传送到物理节点上的VNIC接口,就是vnet接口。
3 数据包从vnet NIC出来,到达桥(虚拟交换机)br100上.
4 数据包通过交换机的处理,从物理节点上的物理接口发出,如物理节点上的eth0.
5 数据包从eth0出去的时候,是按照物理节点上的二层交换机以及默认网关操做的,这个时候该数据包其实已经不受OVS的控制了
2九、python要求输入一个列表,其中值为整数,输出为偶数,而且偶数所在的索引值也是偶数,例:输入[1,3,2,5,4,6],输出[2,4]
答:这个最大问题是要求随机输入,那么输入的列表就变成字符串型了,必须想个办法替换掉列表外边的单引号,使用eval方法
list1 = eval(input("请输入一个列表:")) ##若是不加eval.那么list1就是<str>类型的。
list2 = [] ##eval将字符串str当成有效的表达式来求值并返回计算结果
def fun(list1):
count = len(list1)
for i in range(count):
if list1[i] % 2 == 0 and i%2 == 0:
list2.append(list1[i])
print ('输出后的列表是:',list2)
return list2
fun(list1)
30、分析简单代码,求输出结果。
class p(object):
attr = 'a'
class c1(p):
pass
class c2(p):
attr = 'd'
class c3(p):
pass
print ('第1次',p.attr,c1.attr,c2.attr)
c1.attr = 'b'
print ('第2次',p.attr,c1.attr,c2.attr)
p.attr= 'c'
print ('第3次',p.attr,c1.attr,c2.attr,c3.attr)
答:#第1次 a a d
#第2次 a b d
#第3次 c b d c