1.什么是性能測試? 測試系統有沒有性能問題 考慮時間,空間 服務端資源是否足夠? 響應時間是否超時? 系統是否足夠穩定? 2.性能測試的核心原則是什么? 基於協議,多線程,場景設計 協議:所有的請求都是基於協議發出去 http,https,udp,tcp,mqtt 多線程:壓力測試是基於java多線程原理,通過線程去模擬用戶的行為 基於場景:控制器+定時器設計各種場景滿足壓測要求 並發場景 負載場景 穩定性 壓力測試 。。。。。。 jmeter工作原理:基於協議,通過多線程的方式模擬用戶行為,設計各種場景壓測服務端,得到性能數據,分析性能瓶頸 3.性能測試的應用領域有哪些? 能力驗證:乙方向甲方交付項目時,聲明項目的性能數據。 例如:向甲方聲明能支撐500人1s內同時登錄,響應時間在2s以內。出具性能測試報告去證明我聲明的能力。 瓶頸分析:在能力驗證的過程中可能會發現一些瓶頸,通過技術手段分析瓶頸,得到分析數據,為后續調優做理論依據。 響應超時:什么負載量的時候出現超時現象? tps達到瓶頸,波動劇烈:tps瓶頸點在哪里?,在什么地方出現性能衰減? 性能調優:在得到瓶頸分析數據之后,做性能調優。 降低超時,提高tps,減少抖動。。 容量規划:基於未來。為將來的用戶激增提前做准備 數據庫擴容 服務端硬件優化(增加cpu,擴充磁盤,提升帶寬,分布式,負載均衡。。。) 4.壓力工具的工作原理是什么? jmeter工作原理:基於協議,通過多線程的方式模擬用戶行為,設計各種場景壓測服務端,得到性能數據,分析性能瓶頸 5.性能測試基本思路是什么? 測什么:明確測試目標(明確需求) 怎么測:怎么設計場景? 測試計划,測試用例,測試方案 數據准備 參數化,表達式,斷言 場景設計(並發,負載,壓測) 得到性能測試結果 測試結果驗證 驗證結果數據是否符合預期 如果預期響應時間是3s,但是實際結果響應時間達到了5s 不合格 預期最大tps需要達到500,但是實際最大的tps只有300 不合格 6.交付一個性能測試項目,請闡述你的性能測試流程 1:明確測試需求 2:基於需求設計測試用例,測試方案,測試計划 3:准備測試數據,測試賬號(預估並發量),設計測試腳本(參數化,表達式,斷言,控制器) 4:運行測試腳本,數據監聽(響應時間,tps,活動線程),結果分析(判斷性能瓶頸) 5:基本性能瓶頸做調優(tomcat線程池,jvm內存,swap內存,帶寬) 6:調優之后做性能回歸,和前期結果做對比,是否有明顯的優化。 7:代碼問題優化(自己定位或者交給開發定位) 8:性能測試報告。整理性能測試數據(包括調優之前和調優之后) 9:構建持久化的性能監聽平台,監聽線上的服務性能 性能測試貫穿項目始終,從需求分析到上線之后,都需要持續跟蹤分析發現問題,響應解決問題 7.測試哪些關鍵場景? 瀏覽器層面: web端和app端(H5頁面) 關注首屏時間(頁面打開到完全呈現) 腳本加載時間,cpu占用,fps頻率(幀頻率越高,流暢度越高) 接口層面 權限划分 普通用戶權限(非常多的的用戶) 大並發場景:包括查詢,表單提交 數據量也需要考慮(電商平台,門戶網站) 負載場景:用戶長期在線訪問,對資源的要求會很高 管理員權限(幾個用戶) 大數據量的場景(管理幾十萬用戶數據) 列表查詢時間,分頁時間 數據下載(excel,數據導出)是否會內存溢出 mysql數據庫是否會死鎖,sql查詢是否異常 超管(1個) 大數據量的場景(管理幾十萬用戶數據) 8.前端性能測試關注哪些點?了解哪些前端性能優化方法? 首屏時間:頁面完全展現需要的時間 白屏時間:頁面第一幀畫面出現之前的時間 腳本加載時間,fps,cpu,network 前端性能優化:使用緩存,壓縮圖片,壓縮js,css,gc回收優化,js前置 9.解釋常用的性能指標的名稱與具體含義 用戶角度 響應時間(rt)從發起請求,到接口響應,到頁面渲染 錯誤率(error) 服務端角度 rps(request persecond)每秒請求數,用戶發起的 tps(transaction persecond)每秒完成事物數,服務端決定的 通過rps指標,來測試tps,從而衡量服務端性能。 瀏覽器層面 qps(query perecond)每秒查詢接口數(uv pv) 刷新一次頁面,調用了三個接口 hps(hit persecond)每秒點擊率 10.性能測試類型有哪些?按順序描述 並發數先確定 基准測試(得到性能數據,為后續的回歸測試做理論依據) 單接口基准測試 容量基准測試 負載測試 不斷增加負載量(壓力),一直到瓶頸點出現,可以停止 壓力測試 1:穩定性壓測 假設瓶頸點在300tps,用對應的負載量的80%-90%做持續性(幾小時或者幾天)的壓測。目的是發現穩定性問題(內存溢出等等) 2:破壞性壓測 用對應負載量的100%或者150%做壓測,直接讓服務器出現異常。目的是及早的暴露問題 失效恢復測試 服務端出現異常之后能不能及時恢復 11.什么是集合點?設置集合點有什么意義?jmeter中如何設置集合點? 集合點更多的運用在並發測試 為了讓壓力盡可能的落在同一個時間點 12.什么是固定等待和隱式等待? 固定等待:超時時間=0 線程數一定要>=集合數。一定要集合完畢才發起請求 隱式等待:超時時間>0 達到超時時間范圍,無論集合多少線程都會發起請求 13.什么是負載?有哪些負載模式? 負載就是壓力 1:用戶模式。不斷增加的用戶數帶來的壓力 1個用戶1s內發起20個請求,rps=20/s 2:請求模式,不斷增加的請求數帶來的壓力 10個用戶,1s用戶1s內發起1個請求,rps=10/s 不能單純的通用用戶去衡量壓力,直接通過每秒請求數去衡量壓力。直接從服務端考慮 14.你在測試中遇到過哪些性能問題? h5頁面響應時間過長 h5的分頁經常卡死,sql查詢過多,數據量過大 導出excel時間過長,頁面503,后台報內存溢出 功能涉及到算法的時候,一定要在測試環境用大量數據去模擬 123456789 23456789 3456789 點擊按鈕,任意兩個數字之和等於5,就展示出來 只要點擊,后台cpu立刻就是300% 15.你在性能場景設計中用到哪些方法? 參數化,關聯,斷言,jdbc連接 16.什么是關聯,如何動態關聯?有哪幾種關聯的方法? 正則關聯,json關聯,xpath關聯 保證接口上下游是銜接的 17.jmeter負載測試中怎么保持session會話? ${__setProperty(cookie${counter},${COOKIE_beegosessionID},)} 存儲session ${__P(cookie,)} 從屬性表提取session 18.什么是Ramp up?你如何設置? 線程啟動的時間 ramp越大,單位時間內的壓力越小。ramp=0表示單位時間壓力無窮大,線程啟動時間無窮小。ramp=0不代表時間為0 19.如何識別性能瓶頸? 1: 隨着負載不斷升高,tps也是不斷升高的,正常邏輯 2:隨着負載不斷增加,tps不再增加,甚至下降。表示單位線程的tps實際在衰減。tps的瓶頸點 20.非gui下如何參數化運行場景? ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- 21.簡述堆區的空間分配和gc原理 年輕代 1個eden 2個存活區(S1和S2) 老年代 GC(垃圾回收) 內存溢出:OOM(OUT OF memory) 1:運行內存>當前空間剩余內存 2:垃圾不能及時回收 年輕代GC: 1:最初的對象是存活在eden;伊甸園空間滿了之后,會進行第一次GC; 2:第一次GC之后,依然存活的對象,會被丟到S1(第一個存活區); 3:S1初次滿了之后,會進行第二次GC(年輕代GC) 4:第二次GC之后,依然存活的對象,會被丟到S2(第二個存活區),同時清空伊甸園和S1; 5:S2滿了之后,會進行第三次GC,依然存活的對象,會再次被丟到S1,同時清空伊甸園和S2; 年輕代里面的垃圾碎片都是比較小;老年代的碎片比較大; 讓垃圾盡可能的在年輕代里面進行回收;否則會影響老年代空間的整理; 老年代GC: 1:年輕代的GC年齡超出閾值(默認16次),會把年輕代依然存活的對象扔到老年代; 2:對象的尺寸超出了閾值;對象尺寸超出了閾值,會直接進入老年代; 3:對象的大小超出了年輕代剩余的空間大小,直接進入老年代; 老年代GC=fullGC(一般默認) 1:老年代剩余空間不足以對象進入;老年代會直接進行一次fullGC; 2:老年代的對象無法進行GC;老年代會進行一次fullGC; 老年代的對象尺寸都比較大,所以gc時間會很長,同時所有線程會出現暫停; jvm調優是為了規避fullgc的頻繁出現;會影響到tps; jstat -gcutil pid 1000 監聽gc情況 jmap -heap pid 查看內存空間分配情況 jvm參數調優 調堆內存空間,調年輕代的gc年輕,調空間分配比例(老年代:年輕代 / eden:存活區);調gc回收器,並行回收機制 22.什么是內存溢出 1:運行需要的內存大於空間剩余內存;會出現內存溢出 2:垃圾無法進行GC;會出現內存溢出 23.簡述cpu的工作原理 分析cpu參數:lscpu CPU(s): 2 cpu個數 Thread(s) per core: 1 每核的線程 Core(s) per socket: 1 每個卡槽的核 Socket(s): 2 每個cpu的卡槽 雙cpu,4核多線程;每個cpu是雙核; cpu負載和利用率 可運行的進程(雙r)+不可中斷的進程(block) running(運行中的)+runnable(等待運行的)+block(等待io)=cpu的負載 利用率:cpu雙線程如果都在調度java進程,表示當前cpu利用率是100%; cpu雙線程如果只有一個java進程在調度,表示當前cpu利用率是50%; 最理想的情況:每個cpu線程都調度一個java進程,此時的負載=4; 不理想的情況:java進程數遠大於cpu線程數,此時負載會遠遠超出cpu線程數;不能及時調度的進程就會排隊; cpu會給運行中的和等待運行的進程數均勻分配時間片; cpu調度是以時間片為基准的;假設調度時間為1ns,調度超出1ns之后,進程會被掛起;切換到下一個進程 隊列越長,cpu時間片就越小,調度時間就會越短,切換的越快;切換的過於頻繁,cpu利用率就會很低,線程也會暫停 進程是最小資源分配單元; 線程最小調度單元; 24.什么是上下文切換?哪些場景會存在上下文切換? 1:線程的切換 切換的時間加載寄存器和計數器 保存數據和位置信息,然后切換到下一個線程並讀取它的數據和位置信息 2:進程切換 3:特權切換 系統調用(切換兩次上下文) 用戶空間向內核空間發起申請,內核空間返回api給用戶空間調用; 26.什么是swap空間?oomkiller了解嗎?怎么開啟swap空間 swap:從磁盤空間開辟的虛擬用戶空間。 cat /proc/sys/vm/swappiness 查看swap比例 當內存空間使用超出了比例,會啟用swap空間(內存交換) so 換出 si 換入 swapon -a 啟用swap sudo sysctl vm.swappiness=10 臨時修改swappiness比例 vim /etc/sysctl.conf 永久修改swappiness比例 27.什么是進程優先級? pr和ni ni范圍 -19---+20,ni值越小,進程優先級越大;ni越大,進程優先級越小; 優先級越高的進程,優先調度cpu,時間片分配的越多; 28.吞吐量大幅度波動有哪些原因? 上下文切換的過快; gc次數過於頻繁; 29.哪些現象說明了IO瓶頸? await=io等待時間=io處理時間+io隊列時間 svctm=io處理時間 await與svctm的差值越大,表示隊列時間越長 util磁盤繁忙度,值越大,磁盤越繁忙; 30.了解哪些資源監控命令? top家族 top,htop,atop,iftop(查看網絡),iotop(查看io) sysstat家族 vmstat vmstat 1 10 mpstat mpstat -P ALL 1 10 查看邏輯cpu iostat iostat -x -k -d 1 10 查看io處理 netstat 查看網絡情況 pidstat 查看進程 31.如何用命令行生成測試報告? jmter -J{參數名} -r{host} -n -t XX.jmx -l XX.jtl -e -o httpreport 簡歷: 1:斷句,言簡意賅,讓面試官能一眼找到關鍵詞 2:突出主題 3:突出能力 4:工作經驗突出價值。從字里行間看出一個人在團隊中從事的角色和價值 最low的詞匯:參與,做了,完成。。。 正確的詞匯:負責XXX,帶領XXX,參與核心功能的XXX測試 5:項目經驗要由遠及近,由低到高;看出一個人的經歷和成長 6:細節問題:標點,錯別字,字體調整,簡歷格式 7:技能一定要在項目經驗里面體現,關聯
