Devops(2)

    

     宣佈一個事情,那就是我找到工做了!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

本站公眾號
   歡迎關注本站公眾號,獲取更多信息