很對不起你們,又是一篇亂序的文章,可是滿滿的乾貨,來源於實踐,相信你們會有所收穫。裏面穿插一些感悟和生活故事,能夠忽略不看。不過聽你們廣泛的反饋說這是其中最喜歡看的部分,好吧,就當學習以後輕鬆一下。git
Redis各類數據結構性能數據對比github
測試工具:perf4j面試
性能指標:平均值,最小值,最大值,方差redis
對比將814條數據按單條插入到哈希MAP和哈希SET:數據庫
對比從814條數據的哈希MAP和哈希SET中判斷一個元素是否存在(map的hasKey和set的isMember):數組
大量數據插入哈希MAP,運行一個多小時插入到2w多條的時候再也插入不進去了。想單個刪除也很慢,跟插入差很少的慢。可是刪除一整個key卻很快。這和C語言的原理有關。刪除key實際上是刪除的對value的引用,內存空間不須要重置,只在須要的時候將其重寫。寫過一個C語言基礎入門的程序:緩存
#include<stdio.h> main(){ int a[5]={1,2,3,4,5}; int b[5]={1,2,3}; int c[]={1,2,3,4,5}; static int d[5]; int e[5]; int f[0]; int i; for(i=0;i<5;i++)printf("%10d",a[i]);printf("\n"); for(i=0;i<5;i++)printf("%10d",b[i]);printf("\n"); for(i=0;i<5;i++)printf("%10d",c[i]);printf("\n"); for(i=0;i<5;i++)printf("%10d",d[i]);printf("\n"); for(i=0;i<5;i++)printf("%10d",e[i]);printf("\n"); for(i=0;i<5;i++)printf("%10d",f[i]);printf("\n"); }
運行結果:性能優化
最後兩行出現這個結果的緣由是分配的地址空間原來是什麼值就會顯示什麼值,因此是隨機的。數據結構
性能優化實踐併發
前段時間我改了併發量最大的媒資接口的JVM啓動參數,修改以前棧空間是4G,新生代是1G,基本沒有full gc。minor gc至關頻繁,平時1秒1次,併發量上去以後每秒4,5次。我將棧空間設置爲8G,新生代設置爲5G,平時大概4,5秒一次,估計併發量上去以後仍是會達到1秒1次。固然有的機器會少些。由於咱們公司用的是SLB的7層負載均衡,採起的是輪詢策略,負載不是很均勻。我如今在試圖從根本上解決問題,找到minor gc頻繁的緣由,最終要將minor gc口平時控制在12秒一次以上。12秒這個數據是怎麼來的呢。
看我標出來的這兩個差值,大致新生代的垃圾回收時間是18ms。若是12m一次,就是12000ms中垃圾回收時間佔18m,千分之1.5的時間用於垃圾回收,這個比率對於總體性能的影響就沒那麼大了。固然各個數組會隨調整變化,到時候要看狀況。
以前我也參與過這個媒資接口的性能優化,一直沒有成效是由於第一我對媒資接口不熟,我也不是最主要的負責人,不少事情作不了主。其實,通常解決這個問題的方式是橫向擴展,其實咱們有不少空餘設備,德偉不願試試,我也沒辦法。另外,媒資接口雖然是咱們這邊最重要的接口了,可是我總會被臨時調到一些更緊急的項目中去,東一點西一點的。雖然說以爲本身是個SMP(對稱多核處理器),可是內核上下文切換也得保存現場吧,開銷很大,作不深刻,時間片又到了。這都是本身當初沒有想好,沒有本身的負責區域,因此會被來回調。因此如今就作兩件事情。現在設備複用先不考慮了,先從根本上改善程序。
我作了一夜的測試,凌晨4點才睡。得出來一個結論:咱們的定時加載本地緩存對性能有影響。次日我在地鐵上就發消息到羣裏說找到性能上不去的根了。次日咱們開會討論了,你們最後的決定是個人想法能夠試一試。可是從統計圖表上看,內存,CPU,499和響應時間關聯不大。我說咱們系統目前的現狀也不會是一個緣由形成的,定時加載本地緩存確實和內存按期的峯值很匹配,確實是問題。既然是問題,就要一點點解決。先拋開問題不談,發現本身的另外一個問題:話說的太直,太滿。
以前發生了一件事,我好好檢討了一下,不少方面。
有次照例中午和部門裏一個小姑娘吃飯。她讓我給她提提建議,怎樣能去阿里。她說你看我人還挺可愛的,能不能靠點別的去阿里。我人實在是太直了,我就向她闡述了確實若是實力不夠是去不了的。越聊到最後發現她並非在問個人意見,只是想讓我帶她去阿里。我發現這個仍是按照本身的思路說下去。結果人家小姑娘氣的一下午沒搭理我。確實我話說的太直太滿,是我要解決的問題。也確實我認爲只有實力到了才能去也只是個人想法,人家有人家的方法,只是我不知道,並且不肯意用而已。我總認爲達到一個目標過程更重要,其實哪是人人都這麼想的。思惟不夠開放。我常常給別的公司推薦人才,若是以爲這我的實力不夠,我都不會給推。這倒沒有錯,可是對別人應該有更多的鼓勵,遇到委婉的人說話要更委婉一點。
這個小姑娘聊天中提到你看我雖然有些問題本身解決不了,可是我能夠找別人解決啊,最終問題都解決了。她是以爲本身是能夠幹活的,那麼去阿里是沒問題的。其實據我瞭解,阿里不招這種要不要無所謂的。雖然我也沒進阿里,我是這麼想的。這個小姑娘雖然沒去阿里,可是去的公司也均可以。但把這個歸因於本身很可愛,很招人喜歡我有點不贊同。物有本末,事有始終。反思一下我本身,記得11年,換工做形式一片大好的時候,我雖然沒有換工做,確實出去面過試。面試其實問題回答的都不是很好,可是都給了offer。其中面了華爲的,面試官說咱倆一個學校的,我們東大的人基礎不該該這麼差啊。結果什麼都不會,仍是要我了。究其緣由,要我是由於學校比較好,而後去的公司都比較好,人不笨,以爲仍是有培養價值的,反正成本也不是很高。和可不可愛關係不是很大,額,我說話是否是又太直了。其實我當初若是遇到了更多的挫折,如今技術能力應該好很多。因此如今我很珍惜遇到的問題,時間許可的範圍內,解決很差過程,不去追求結果。特別是作技術的,長遠穩定性,前瞻性,很重要。還有一點,女孩子其實在技術工做中面對的劣勢遠遠大於優點,我天然也遇到過,可是我本身不太清楚是哪些。由於這個劣勢體如今根本不會給我面試的機會。能讓我面試的,我相信面試的過程仍是很公平公正的。至少我經歷過的過與不過都有理有據。
我聲稱本身是個技術吃貨,也就是這半年的事情。以前,一直是個技術二貨。上家公司在五道口清華科技園,是朋友在那邊,把我挖過去的。去的時候我就很明確的說由於這邊不是很忙,我家孩子小,我要先照顧好家。分清當前事情的主次是必要的。但是記得那時候天天11點就去吃飯了,吃完飯還要去買個肯德基套餐帶着去旁邊清華大學,到下午3點再回去上班。不少該作的沒作,該學的沒學。當初的時間利用起來,如今不至於這麼時不時情不自禁的來一句:I am so stupid. 發現身邊不少作技術的女孩子,包括本身在內,對技術現狀,對各大公司的形勢,各個方面攝取的信息太少。不知者無畏,反而會比較自大。前段時間本身也是很浮躁,其實技術基礎都不是很紮實。我有個學弟,工做三年的時候就出去創業作CTO了。旁邊也有不少人很年輕有爲的,很早就不作技術了,直接轉管理。我原來在想:我和他們走的路都不同。我要儘可能更多的時間活躍在底層一線,由於想要工做到60歲。提高的過早,之後會越早達到瓶頸。想法很符合自身的狀況,可是實際上努力不夠。行遠自邇,登高自卑。時刻保持危機感,強化學習意識。
回到最初的問題。定時加載本地緩存。我試過,對這個服務來講,已加載在本地緩存的數據獲取速度比遠程(其實這裏測試集中緩存和數據庫速度差很少)快幾十倍,並且很穩定。可是最初加載的時候,咱們設定啓動後50秒暴露服務,也仍是不能保證加載完,會致使服務重啓發生短暫的鏈接池溢出。並且我感受咱們的dubbo鏈接池設置了700,太大了,反而致使響應慢。開會討論將緩存全量更新時間由原本的一小時或者半小時設置爲12小時試試結果。結果因爲發生了一些非技術緣由如今正式環境尚未試,測試環境沒有對比。可是開頭介紹的redis緩存徹底能夠派上用場。在key值1000個如下的小本地緩存能夠第一次加載的時候從redis緩存裏取,redis緩存由單獨的後臺服務控制更新,記錄最後更新時間。其實更新服務我放到離線服務裏了。若是最後更新時間發生變化纔會再次取最新數據。我觀察了一個星期,字典值,TV值,字典配置值一個星期就沒變過。耗費那麼大的性能去更新,好心疼。而後20幾萬佔100M多棧內存的明星數據,定時全量和增量執行更新,啓動都須要幾十秒作這個事情,當初寫這個代碼的哥哥,你寫的時候真的測試過這麼作能夠提升性能嗎[汗]
epiphany框架改進
既然我要寫文,就不得不提一下個人開源框架進展。這是一個離線數據推送的框架,支持全量,增量和手動發送。幾個部分可分開和整合部署。用戶能夠靈活的選取所有部署,或者部分部署。或者在須要的狀況下進行升級,降級處理。目前最新版本的改進是支持全量模式耗時長的數據優先運行的策略,以達到整體數據各個線程間耗時平均。固然用戶能夠本身決定是否使用此策略。在全量增量同時運行的狀況下,支持both模式和yield模式。both模式即運行全量的狀況下也運行增量,yield模式即全量運行時增量暫停,待全量運行完接暫停時間點繼續運行。詳情請參閱個人github代碼:https://github.com/xiexiaojing/epiphany
我在寫框架的時候,一定用到不少測試和性能監控的東西。其中JVM我打開了不少參數,發出來供你們參考,紅框標出的是一些監控,測試時能夠打開。
程序在跑,今晚夠嗆能睡覺。
生活點滴
前段時間坐公交車,上來一個2歲左右的小朋友,上車一下子後開始哭,聲音特別大。我猶豫了一下,翻翻包,找到以前包上掉下的一個裝飾,由於還挺好看的,我順手就裝包裏了。我拿到小朋友的面前,讓他猜猜這個飾品的兩面是否是同樣的。他不哭了,也不回答,愣愣的看着我。我就把飾品遞到他手上,回到本身的位子。小朋友沒有再哭。下車以後,小朋友在車窗那邊跟我打了好幾個飛吻,這招我兒子就不會。當初猶豫了一下子是在想萬一哄了還哭,一車人看着我多尷尬。可是想一想別把本身當回事,你們誰有閒心看我。事實證實我錯了,我看到全車人都在看我。可是想作什麼就去作吧,作了就不後悔了。
男神說我長的難看
全世界我就認識一個當面說我長的難看的,就是我家男神。以爲我應該跟他離婚。不過想一想就他嫌我難看,我當初還非要嫁他,看來我倆眼神兒都不咋地,不是一家人不進一家門,仍是將就過吧。
看看人家都怎麼評價個人:
再看我家男神:
我和男神這幾年來就吵過一次架,就是他說我長的難看。我生氣了,他看我生氣他也生氣了。摔了好幾瓶紅酒而後摔出門去回北京了。兩個小時後他打電話回來講快到公司出差給租的房子那裏了,讓我別被玻璃碎片扎到。又過半小時打電話回來講已經開始往回返了。好吧,次日他又2個多小時回到租的房子附近上班。而後我上班中午吃飯時跟女同事說我家男神說我長的難看。女同事是這麼安慰個人:你就跟他說我長的好看還跟你啊,你長的好看啊。我在想在別的狀況下我是否是該跟我女同事翻臉,竟敢說我家男神很差看。可是人家是好心,我也就只能低頭喝粥。粥好涼好涼,心拔拔涼。
一家人相處
咱們家相處你們很自由。好比說我要是這段時間注重打扮,男神就會向我指出我哪裏穿的很差看。若是我這段時間頭也不梳,那就這樣吧,也沒人管,也沒人說。我對我家男神也是,他喜歡幹什麼工做就什麼工做,他說他想早退休我以爲也很正常。我也就默默的想一想怎麼解決他退休金不夠花的問題。我和婆婆關係相處的特別好。首先一點,我婆婆家樓房是咱們有孩子了,可是本身還沒買房子的時候先給他們買的。我家嫁女兒沒要人家一分錢還倒賠了嫁妝。我家兩套房子首付是我出的,貸款我還更多的那套。我也不傻,之因此這麼作,老人都窮過,比較看重物質。因此我付出這麼多,我內心是平衡的,老人也不會對兒媳太挑剔了。而後婆婆作飯我也歷來不挑,好吃就多吃點很差吃就少吃點。孩子大了,婆婆平時沒事兒喜歡撿瓶子賣錢,我也沒意見,各人有各人的想法,開心就好。可是我本身喝的礦泉水瓶子都會拿回家。這是一種尊重。而後婆婆留長髮,她用的扎頭繩老是鬆,因此我要是出門,必然給婆婆買個素色頭繩。謝天謝地,如今的東西都是看着好看不耐用,不然我就少了一個表現的機會。