面試常見問題總結


1、介紹下自己?

筆者回答:不管是電話面試還是現場面試,自我介紹是避免不了的,上一篇文章我有詳細介紹這塊的內容,這里不做解釋了,感興趣的朋友參考我上一篇文章:

運維工程師面試的經歷及面試相關問題(1)

2、為什么想着要離開現在的公司?

筆者回答:雖然是面試技術,但也會有很多面試官會不經意的問你這個問題,看起來很隨意的問題,其實這個問題里面隱藏了很多信息,最直觀的就是看你這個人對企業的忠誠度、還能看你是不是心浮氣燥的性格等等。如果你曾經頻繁跳過槽,不管出於什么原因,筆者個人都不建議寫在簡歷上,最好能夠合並一些工作時間和單位,企業是很擔心把你招來后會不會短時間你又跳槽了。當然如果都是因為企業經營不善倒閉所至,就沒關系了。說到這里,就想起了筆者曾經一位同事,連續在好幾家單位都干倒閉了,這我也不知道說啥好了。。。好了,咋們接着往下走。

3、TCP/IP原理說一下?TCP有哪幾個狀態,分別是什么意思?

筆者回答:以tcp/ip協議為核心,分五層。tcp工作在第4層,主要有tcp和udp協議。其中tcp是可靠協議,udp是不可靠協議。 tcp傳輸之前,需要建立連接,通過三次握手實現。

TCP三次握手狀態:首先是closed狀態,當發起連接后,進入Listen狀態,當三次握手之后,進入EST狀態。三次握手中間還有一個臨時狀態:SYN_SENT。SYN_SENT 當應用程序發送ack之后,進入EST狀態,如果沒有發送,就關閉closed.

總結:大家一定要熟記tcp狀態轉換圖,參考 http://blog.csdn.net/wenqian1991/article/details/40110703 如下圖:

image.png

4、有個客戶說訪問不到你們的網站,但是你們自己測試內網和外網訪問都沒問題。你會怎么排查並解決客戶的問題?

筆者回答:我們自己測了都沒問題,只是這個客戶訪問有問題,那肯定是要先聯系到這個客戶,能遠程最好,問一下客戶的網絡是不是正常的,訪問其它的網站有沒有問題(比如京東、百度什么的)。如果訪問其它網站有問題,那叫客戶解決本身網絡問題。如果訪問其它網站都沒問題,用ping和nslookup解析一下我們的網站是不是正常的,讓客戶用IP來訪問我們的網站是否可行,如果IP訪問沒問題,那就是客戶的DNS服務器有問題或者DNS服務器解析不到我們的網站。還有一種可能就是跨運營商訪問的問題,比如我們的服務器用的是北方聯通、而客戶用的是南方移動,就也有可能突然在某個時間段訪問不到,這種情況在龐大的中國網絡環境中經常發生(一般是靠CDN解決)。還有可能就是我們的網站沒有SSL證書,在公網是使用的是http協議,這種情況有可能就是沒有用https協議網站被運營商劫持了。

5、redhat 6.X版本系統 和 centos 7.X版本有啥區別?

筆者回答:桌面系統(6/GNOE2.x、7/GNOME3.x)、文件系統(6/ext4、7/xfs)、內核版本(6/2.6x、7/3.10x)、防火牆(6/iptables、7/firewalld)、默認數據庫(6/mysql、7/mariadb)、啟動服務(6/service啟動、7/systemctl啟動)、網卡(6/eth0、7/ens192)等。

6、你會用什么方法查看某個應用服務的流量使用情況?

筆者回答:如果是單一應用的服務器,只需要用iftop、sar等工具統計網卡流量就可以。如果服務器跑了多個應用,可以使用nethogs工具實現,它的特別之處在於可以顯示每個進程的帶寬占用情況,這樣可以更直觀獲取網絡使用情況。

7、說一下你們公司怎么發版的(代碼怎么發布的)?

筆者回答:我說什么來着,這個問題又問到了。發布:jenkins配置好代碼路徑(SVN或GIT),然后拉代碼,打tag。需要編譯就編譯,編譯之后推送到發布服務器(jenkins里面可以調腳本),然后從分發服務器往下分發到業務服務器上。

8、elk中的logstash是怎么收集日志的,在客戶端的logstash配置文件主要有哪些內容?

筆者回答:input、output兩大塊配置;input中指定日志(type、path)等,output指定日志輸出的目標(host、port)等。

9、ansible你用過它的哪些模塊,ansbile同時分發多台服務器的過程很慢(它是逐台分發的),你想過怎么解決嗎?

筆者回答:用過ansible的(copy file yum ping command shell)等模塊;ansible默認只會創建5個進程,所以一次任務只能同時控制5台機器執行.那如果你有大量的機器需要控制,或者你希望減少進程數,那你可以采取異步執行.ansible的模塊可以把task放進后台,然后輪詢它.這使得在一定進程數下能讓大量需要的機器同時運作起來.

10、nginx有哪幾種調度算法,解釋一下ip  hash和輪詢有啥不一樣?

筆者回答:常用的有3種調度算法(輪詢、ip hash、權重)。

輪詢:upstream按照輪詢(默認)方式進行負載,每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。

ip hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

權重:指定輪詢幾率,權重(weight)和訪問比率成正比,用於后端服務器性能不均的情況。

11、nginx你用到了哪些模塊,在proxy模塊中你配置過哪些參數?

筆者回答:用到過(負載均衡upstream、反向代理proxy_pass、location、rewrite等)。

proxy模塊中配置過:proxy_set_header、proxy_connect_timeout、proxy_send_timeout、proxy_buffer_*

12、說一下iptables的原理,有哪些表、哪些鏈?怎么修改默認策略全部為DROP?

筆者回答:iptables是工作在TCP/IP的2、3、4層。你要說它的原理也不是幾話能概括的,當主機收到一個數據包后,數據包先在內核空間中處理,若發現目的地址是自身,則傳到用戶空間中交給對應的應用程序處理,若發現目的不是自身,則會將包丟棄或進行轉發。

4張表(raw表、mangle表、net表、filter表)

5條鏈(INPUT鏈、OUTPUT鏈、PORWARD鏈、PREROUTING鏈、POSTROUTING鏈)。

全部設置為DROP:

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

#iptables -P FORWARD DROP

小結:iptables遠不止這幾句話就能描述清楚的,也不是隨便在網上趴些資料就能學好的,需要自己用起來,經過大量的實驗和實戰才能熟悉它,iptables真的很考驗運維人員的技術水平,大家一定要用心學好這個iptables。

13、如何開啟linux服務器路由轉發功能?

筆者回答:echo "1" > /proc/sys/net/ipv4/ip_forward

14、nginx中rewrite有哪幾個flag標志位(last、break、redirect、permanent),說一下都什么意思?

筆者回答:

  • last : 相當於Apache的[L]標記,表示完成當前的rewrite規則
  • break : 停止執行當前虛擬主機的后續rewrite指令集
  • redirect : 返回302臨時重定向,地址欄會顯示跳轉后的地址
  • permanent : 返回301永久重定向,地址欄會顯示跳轉后的地址

301和302不能簡單的只返回狀態碼,還必須有重定向的URL,這就是return指令無法返回301,302的原因了。這里 last 和 break 區別有點難以理解:

  • last一般寫在server和if中,而break一般使用在location中
  • last不終止重寫后的url匹配,即新的url會再從server走一遍匹配流程,而break終止重寫后匹配
  • break和last都能組織繼續執行后面的rewrite指令

總結:關於nginx rewrite用法,筆者看到一篇文章總結的挺不錯 ,可以參考一下 https://www.jianshu.com/p/a1fce9358d44

15、你在shell腳本中用過哪些語法,case語法會用到哪些地方?

筆者回答:一般會用到if語句、for語句、while語句、case語句以及function函數的定義;case語句為多選擇語句,可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。最典型的case語法會用到啟動服務腳本的處理。

16、linux系統中你會用到什么命令查看硬件使用狀態信息?

筆者回答:這個命令就很多了,比如:lscpu(查看cpu信息)、free -m(查看內存信息)、df -h(查看硬盤分區信息)、top(還可以動態查看cpu、內存使用情況的信息),/proc/目錄下也可以查看很多硬件信息。

17、我要過濾一段文本(test.txt)中第二列的內容?如果這段文件有很多特殊符號,比如用:(冒號)怎么過濾它的第二段?如果我要過濾這段文本中,其中有一行只有7個符如何實現?

筆者回答: awk '{print $2}'   tset.txt

awk -F':'  '{print $2}'   tset.txt

18、比如開發想找你查看tomcat日志,但是catalia.out特別大,你不可能用vi打開去看,你會怎么查看?如果你用 grep -i"error" 過濾只是包含error的行,我想同時過濾error上面和下面的行如何實現?

筆者回答:grep -i "error" catalia.out

grep -C 1  -i "error" catalia.out

參數-C:是匹配前后的行,后面1是匹配前后各1行

19、 怎么編寫一個定時計划任務?里面用到的最小單位是什么?

筆者回答:crontab -e,最小單位是分鍾

20、zabbix如何修改其中監控的一台服務器中內存閾值信息,比如正常內存使用到了80%報警,我想修改為60%報警?

筆者回答:正常來說,一般會把監控的服務器統一加入到一個模板中,修改模板的其是某一項的監控項參數和告警閾值后,加入模板中的所有主機都會同步。如果單獨想修改其中某一台服務器內存告警閾值,需要進入這台主機,單獨創建一個告警Triggers,關聯這台主機監控內存的項,配置好告警的閾值為60%即可實現。其實,zabbix一切都為圖形化操作,如果沒有接觸過zabbix的朋友,可能聽起來不太清楚。

21、mysql主從復制原理說一下?

筆者回答:mysql支持三種復制類型(基於語句的復制、基於行的復制、混合類開進的復制)。

如果你記不住太多內容,可以簡單說明一下原理:

(1) master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);

(2) slave將master的binary log events拷貝到它的中繼日志(relay log);

(3) slave重做中繼日志中的事件,將改變反映它自己的數據。

20180112090827.jpg

如果你能詳細記住它的原理,可以這么回答:

該過程的第一部分就是master記錄二進制日志。在每個事務更新數據完成之前,master在二日志記錄這些改變。MySQL將事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成后,master通知存儲引擎提交事務。

下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日志。

SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位於OS的緩存中,所以中繼日志的開銷很小。

22、用什么命令可以查看上一次服務器啟動的時間、上一次誰登錄過服務器?

筆者回答:w命令查看上次服務器啟動時間。last命令  查看登錄。

23、redis集群原理說一下,正常情況下mysql有多個庫,redis也有多個庫,我怎么進入redis集群中的第2個庫?還有,我想查看以BOSS開頭的值?redis持久化是如何實現(一種是RDS、一種是AOF),說一下他們有啥不一樣?

筆者回答:這個redis原理的問題又問到了,看樣子很多面試官都很關心這個redis,在上一篇文章筆者的一次面試也有這個面試問題。

【集群原理】:其實它的原理不是三兩句話能說明白的,redis 3.0版本之前是不支持集群的,官方推薦最大的節點數量為1000,至少需要3(Master)+3(Slave)才能建立集群,是無中心的分布式存儲架構,可以在多個節點之間進行數據共享,解決了Redis高可用、可擴展等問題。集群可以將數據自動切分(split)到多個節點,當集群中的某一個節點故障時,redis還可以繼續處理客戶端的請求。

【切庫】:單機情況下用select 2可以切換第2個庫,select 1可以切換第1個庫。但是集群環境下不支持select。可參考https://yq.aliyun.com/articles/69349

【redis持久化】:持久化通俗來講就是將內存中的數據寫入硬盤中,redis提供了兩種持久化的功能(RDB、AOF),默認使用RDB的方式。

RDB:全量寫入持久化,而RDB持久化也分兩種(SAVE、BGSAVE)。

SAVE是阻塞式的RDB持久化,當執行這個命令時redis的主進程把內存里的數據庫狀態寫入到RDB文件(即上面的dump.rdb)中,直到該文件創建完畢的這段時間內redis將不能處理任何命令請求。

BGSAVE屬於非阻塞式的持久化,它會創建一個子進程專門去把內存中的數據庫狀態寫入RDB文件里,同時主進程還可以處理來自客戶端的命令請求。但子進程基本是復制的父進程,這等於兩個相同大小的redis進程在系統上運行,會造成內存使用率的大幅增加。

AOF:與RDB的保存整個redis數據庫狀態不同,AOF的持久化是通過命令追加、文件寫入和文件同步三個步驟實現的。AOF是通過保存對redis服務端的寫命令(如set、sadd、rpush)來記錄數據庫狀態的,即保存你對redis數據庫的寫操作。

為了大家能夠更好的理解redis持久化,筆者建議大家可以看下這兩篇文章會比較好理解:

https://www.cnblogs.com/Fairy-02-11/p/6182478.html

http://blog.csdn.net/mishifangxiangdefeng/article/details/48977269

24、你在工作的過程中,遇到過你映像最深的是什么故障問題,你又是如何解決?

筆者回答:這個問題主要也是考你排查故障的思路及用到的相關命令工具,其每個人在工作中都會遇到各種各樣的問題(不管是網絡問題、應用配置問題、還是APP打開慢/網站打開慢)等等。你只要記住一個你映像最為深刻、最為典型的故障就行。筆者也遇到過各種問題,我在這里就是寫出來,怕誤導了大家。

25、在linux服務器上,不管是用rz -y命令還是tftp工具上傳,我把本地的一個文件上傳到服務器完成后,服務器上還是什么都沒有,這有可能是什么問題?

筆者回答:根據這種現象有可能是:服務器磁盤滿了;文件格式破壞了;或者你用的是普通用戶上傳,正好上傳的目錄沒有權限;還有可能就是你上傳的文件大小超出了該目錄空間的范圍。

26、你在工作中都寫過什么腳本?

筆者回答:這個問題的回答別把話說得太大了,要結合實際情況來回答。寫過mysql、redis、mongodb等數據庫備份的腳本;服務器文件備份的腳本;日常代碼發布的腳本;之前用nagios的時候寫過一些nagios插件的腳本。

27、rsync+inotify是實現文件實時同步的,加什么參數才能實現實時同步,--delete參數又是什么意思?

筆者回答:rsync是遠程同步工具、inotify是一種強大的異步文件系統系統監控機制。通過inotifywait 中的-m參數可以實現“始終保持事件監聽狀態”。rsync中的-delete參數是指“ 刪除那些DST中SRC沒有的文件”。

28、我想查看access.log中哪個IP訪問最多?

筆者回答:awk '{print $1}' access.log| sort | uniq -c |sort -rn -k 1  | head -1

上面的具體參數如果有不知道的,大家可以自行百度一下,這里不說參數這么細節的問題

29、在linux系統中,一般都會有swap內存,你覺得使用swap內存有什么好處,在什么情況下swap內存才會被使用?你覺得在生產環境中要不要用swap內存?

筆者回答:好處:在內存不夠用的時候,將部分內存上的數據交換到swap空間上,以便讓系統不會因為內存不夠用而導致oom或者更致命的情況出現。

什么情況下會用swap:當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什么操作的程序,這些被釋放的空間被臨時保存到swap空間中,等到那些程序要運行時,再從swap中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行swap交換。

30、怎么查看兩台服務器之間的網絡是不是正常的,服務器是禁ping的?

筆者回答:不能用ping,那可以用telnet對方服務器的端口、或者互相訪問對方打開的服務。其它的測試方法筆者也沒想到,要是哪位朋友有好的方法不訪在下面留言討論。

31、比如我訪問百度網站,有什么方法可以跟蹤經過了哪些網絡節點?

筆者回答:這個太簡單了吧,干運維必備的網絡排查技能。用tracert命令就可以跟蹤,主要是查詢本機到另一個主機經過的路由跳數及數據延遲情況。然后你也可以把具體跟蹤后輸出的信息也說出來,你能說出來都是為你加分的。

32、如果你們公司的網站訪問很慢,你會如何排查?

筆者回答:看到沒有,又問到了這個問題,筆者在上一篇文章 2017年2月14號的面試中面試官也問到同樣的問題。其實這種問題都沒有具體答案,只是看你回答的內容與面試官契合度有多高,能不能說到他想要的點上,主要是看你排查問題的思路。我是這么說的:問清楚反應的人哪個服務應用或者頁面調取哪個接口慢,叫他把頁面或相關的URL發給你,首先,最直觀的分析就是用瀏覽器按F12,看下是哪一塊的內容過慢(DNS解析、網絡加載、大圖片、還是某個文件內容等),如果有,就對症下葯去解決(圖片慢就優化圖片、網絡慢就查看內網情況等)。其次,看后端服務的日志,其實大多數的問題看相關日志是最有效分析,最好用tail -f 跟蹤一下日志,當然你也要點擊測試來訪問接口日志才會打出來。最后,排除sql,,找到sql去mysql執行一下,看看時間是否很久,如果很久,就要優化SQL問題了,expain一下SQL看看索引情況啥的,針對性優化。數據量太大的能分表就分表,能分庫就分庫。如果SQL沒啥問題,那可能就是寫的邏輯代碼的問題了,一行行審代碼,找到耗時的地方改造,優化邏輯。

33、我需要查看某個時間段的日志(比如access.log日志),如何實現?

筆者回答:方法有很多種,比如我要看查的時間是2018年1月9號--1月10號的日志吧。

比如可以用sed命令,格式為:sed -n '/起始時間/,/結束時間/p' 日志文件,如下:

sed -n '/09\/Jan\/2018/,/10\/Jan\/2018/p' access.log

比如可以用grep,格式為:grep  -E '起始時間|結束時間'  日志文件,如下:

grep -E '09/Jan/2018|10/Jan/2018' access.log

當然,你還可以結合cat、grep 、awk這些命令一起來使用都行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM