一點技術心得

下午想到了幾點心得,總結下來。

  1. 消息隊列快速讀寫

消息隊列常用於流量削峰、非同步處理、不同系統間的通信,有一個重要點就是快速讀寫,有的消息隊列還支持久化,持久化就要與磁碟打交道,IO是一個重要的瓶頸,如何提高寫磁碟的效率呢?有兩個重要的理倫很重要:順序讀寫比隨機讀寫要快;磁碟的局部性原理。metaq使用了pagecache,一個commitLog的大小是1G,數據並不是直接寫入到磁碟中,那太慢了,它使用到了內存映射,解決IO瓶頸,然後每隔一定的時間刷到磁碟中(批量寫+順序寫),當然也可以實時刷盤和group commit。這裡就有一個問題,在沒有落地磁碟前,消息是可以丟失的,所以沒有100%的可靠性。metaq的高速的一個重要原因是使用到了內存映射pagecache。

2. 系統橫向擴展

現在是分散式的時代,不管是存儲還是計算也好,單台機器的性能都有極限,如何使系統能橫向擴展,部署10台機器和部署1000台機器一樣,並且性能是線性提高。這裡有一個關鍵的問題就是系統之間是無狀態的(相互獨立),要做到這一點,有不多的方法來實現,其中有一個方法就是集群,每台機器都是從集群中取數據,現在的微服務是不是這樣的呢?系統橫向擴展是一個非常重要的點。

3. NIO

不管是網路還是磁碟,都是IO,常見的IO就會阻塞。有不同的方式來處理網路通信:

a. 單進程:一個IO阻塞就會阻塞其它的讀寫請求,所以單線程變成多線程模式;

b. 多線程:一個線程阻塞不會影響其它的線程,缺點是線程一多上下文切換就多,所以多線程優化成線程池,不管怎樣,IO阻塞還是沒有解決掉。

從一個讀操作的流程可以知道,它是分兩個步驟的:一個是接收讀命令、二是讀操作,這兩個操作是綁定在一起的,關注分離點,就是把這兩個步驟劃分開,有一個線程來接收所有的命令,其它的線程當讀寫就緒後再進行操作,減少阻塞等待的時間。這也是職責分離的一個重要體現!

另外提高IO操作,一個重要的方法就是內存映射,讀磁碟與讀內存一樣,豈不快哉。


推薦閱讀:

小米6性能怎麼樣?
預算4500左右配一台主機(僅主機)玩OW和GTA,求大神推薦一下目前這個價位才能配到最性價比的機器?
vivo X9性能怎麼樣?
加速你的MATLAB開發(3): 使用Profiler找出性能瓶頸
動態追蹤技術:trace your kernel Functions!

TAG:性能 | 計算機技術 |