Shopee蝦皮SRE工程師一面面經

2021-10-24 03:54:12 字數 3950 閱讀 6659

2020.08.31,大概面了乙個小時左右,其中半小時在做演算法(而且還沒做出來,我真是太菜了),之後狀態就不是很好,感覺面試官想考察的點總是get不到,表達也不是特別專業性。面試官感覺有些嚴肅,但是我回答不上來的地方也會和我說沒事給一些提示給我,總的來說作為春招以來過了這麼久第一場面試,還是挺有收穫的

1. 自我介紹

2. 平時用什麼語言,寫一道演算法題

一開始看到 o(n

logn

)o(nlogn)

o(nlog

n)我也覺得是快排或者歸併,可是由於是鍊錶沒想出來如何二分且是常數級空間複雜度,後來徵求了面試官同意後使用暴力解法也沒有很快解出來,面試官就讓我說思路了,當時想是用字典對映鍊錶中的節點位置以及對應值再進行排序,但會占用額外 o(n

)o(n)

o(n)

的空間,出來看到別人歸併的題解才知道這麼簡單

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

sortlist

(self, head: listnode)

-> listnode:

# 遞迴返回條件

ifnot head or

not head.

next

:return head

# 使用快慢指標,當快指標到終點時慢指標的位置剛好是一半,時間複雜度為o(logn)

slow, fast = head, head.

next

while fast and fast.

next

: slow = slow.

next

fast = fast.

next

.next

# 將鍊錶cut成兩端,兩邊遞迴

mid, slow.

next

= slow.

next

,none

left, right = self.sortlist(head)

, self.sortlist(mid)

# 使用乙個節點作為返回鍊錶的頭節點,將排序好的鍊錶逐個判斷插入返回鍊錶中

h = res = listnode(0)

while left and right:

if left.val < right.val:

h.next

= left

left = left.

next

else

: h.

next

= right

right = right.

next

h = h.

next

# 左鍊錶或右鍊錶遍歷完後,另一半直接插入到最末尾

h.next

= left if left else right

return res.

next

3. 程序和執行緒了解過嗎,他們有什麼區別,優缺點,應用場景是什麼

演算法沒做出來腦子就卡殼了,許多詞就硬是不知道怎麼表達

4. 程序執行緒排程時的上下文了解嗎

這個不會

5. 核心態和使用者態了解嗎

當在系統中執行乙個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成一些使用者態自己沒有特權和能力完成的操作時就會切換到核心態。這裡應該是想問虛擬化中的ring0~ring3,當時沒get到

6. 殭屍程序和孤兒程序是什麼

7. docker是什麼,和虛擬機器有什麼不同

docker作為「小型虛擬機器」,是虛擬化的一種產物,與虛擬機器不同的是,docker中的容器並不依賴於特定的環境,而是「build once,run anywhere」。docker利用namespace的隔離技術,將容器與容器、容器與宿主機隔離開來,而每個程式在容器內部彷彿都像是在乙個完整的作業系統,對宿主機環境並無感知。而作為宿主機中的程序,容器能發揮的效能接近於原生(這裡一開始說錯說成了比原生若,後來才想起來是虛擬機器的效能弱於原生)

8. docker的資源隔離是怎麼做到的

docker使用了核心提供的namespace隔離技術,實現容器間的資源隔離,現有6種namespace:

9. mysql的儲存引擎

因為面試前看了一篇關於b+數結構的文章,滿腦子都是b+樹,沒答好,續多innodb的特性都沒答到

innodb是mysql目前預設的儲存引擎,底層使用了b+樹作為資料結構,與myisam不同的時,innodb屬於聚集索引,主鍵和資料一起儲存在b+樹的葉子節點中,而myisam的主鍵和資料是分開儲存的,葉子節點中儲存的是資料所在的位址。innodb和myisam的區別:

這上面的都沒答到,我答的是下面的。。。:

innodb的資料結構是b+樹,根據b+樹的特點,所有查詢都是等時的,且因為資料都存在葉子節點上,而葉子節點又是經過排序的,在範圍查詢場景中這種資料結構就顯得十分方便,只需要雙指標定位範圍起點終點,中間的資料就是我們想要的;而對於hash索引來說,由於鍵對映的值只是資料的位址位置,無法看到資料中具體的值,在範圍查詢的場景中就只能全表搜尋了

mysql為了加快資料訪問速度,最小單位不使用檔案系統中的塊,而是使用連續4個塊作為乙個頁(16k),而在innodb中,b+樹儲存的內容是:

對於葉子節點,假設一行資料儲存需要1k(對普通業務絕對夠了),那麼一頁就可以儲存6行資料

對於非葉子節點,假設使用bitint(8位元組)作為主鍵,mysql中的指標大小為6位元組,一共是14位元組,一頁大概能存 16

∗1024/14

=1170

16*1024/14=1170

16∗102

4/14

=117

0(個)key,一棵高度為3的b+樹就能儲存 1170

∗1170∗6

=21902400

1170*1170*6=21902400

1170∗1

170∗

6=21

9024

00(千萬級),所以innodb中一半樹的高度為3就能滿足千萬資料量的需求

10. 看你簡歷上說你用過mycat,你認為為什麼要分庫分表呢

分庫分表的目的都是為了防止海量資料儲存在單台伺服器上造成的單點效能問題,mycat作為分布式中介軟體,可以讓我們的真實資料庫伺服器儲存不同的庫表,而在使用者訪問mycat時並感知不到後端資料的分布,就像是訪問原先儲存所有資料的資料庫一樣,但實際的請求會根據真實資料所處位置打到不同的資料庫中

11. 表分片又是為了什麼

雖然分庫分表已經較好的解決了單點效能問題,但是隨著業務量的日益增長,我們的表也是會越來越大的,也會導致資料庫的效能問題,所以將表按一定的規則劃分,分別儲存在不同資料庫中,再由mycat對使用者請求進行分流,這就解決了表越來越大所造成的問題了

12. 表分片有什麼問題

13. 你認為mycat的適用和不適用的場景有哪些

沒有get到跨庫效能問題,就答了上面說的上面業務量過大表過大庫過大導致單點效能問題做成分布式減輕壓力。。。然後不適用就答了小庫小表劃分反而會造成徒增運維成本,最後面試官提了一句跨庫的效能問題我才想起來,然後答了mycat中的全域性表和er表,又嗯了半天不知道怎麼表達,面試官就說了我大概了解你的意思了,真是太菜了我

反問:不好意思問了就問了學習上的建議

面試官說我學的還可以,問題應該還是實踐不多,缺少總結經驗,很多細節沒法關聯起來,建議我多實踐。因為自己學習基本上都是在虛擬機器上做的,沒辦法模擬出真正生產中的各種問題,面試官說這行可能比較吃經驗,這方面的話可以多看看別人寫的博文,多看看人家怎麼想的,自己再多總結。

Shopee蝦皮SRE工程師HR麵麵經

7號收到的hr面通知,9號面試,面20分鐘,蝦皮還是一如既往的舒服,小姐姐超溫柔。上來就說了之前面試官的評價,校招後續安排,預計是兩周內會給出意向書或感謝信。想進蝦皮的慾望沖昏了頭腦,結束整個人像洩了一口氣空了一樣,問題細節不記得很多了 1.自我介紹 2.兩個專案挑乙個介紹 由於不確定hr是否懂技術...

SRE工程師到底是做什麼的?

儘管站點可靠性工程已經存在了一段時間,但也只是最近才在業界獲得一些名聲。但人們對於站點可靠性工程師 sre 的作用仍然存在很多疑問。我們所知道的大部分內容來自谷歌的 站點可靠性工程 一書。我們將在這篇文章中多次提到這本書。人們將sre與運營 系統管理員等進行比較,但這種比較不足以說明他們在現代軟體環...

SRE工程師到底是做什麼的?

儘管站點可靠性工程已經存在了一段時間,但也只是最近才在業界獲得一些名聲。但人們對於站點可靠性工程師 sre 的作用仍然存在很多疑問。我們所知道的大部分內容來自谷歌的 站點可靠性工程 一書。我們將在這篇文章中多次提到這本書。人們將sre與運營 系統管理員等進行比較,但這種比較不足以說明他們在現代軟體環...