ARTS 1
Algorithm算法部分本周比較初級,之前沒刷過,以后每周多刷一些。順便學下go語言palindrome-number// 思路 此消彼長 x=全部數字 r=
Algorithm
算法部分本周比較初級,之前沒刷過,以后每周多刷一些。順便學下go語言
palindrome-number
// 思路 此消彼長 x=全部數字 r=后半段數字的翻轉 當 r >= x時說明已經過了 x的一半了 如果是偶數 x==r 如果是奇數則去掉最后一位判斷相等n// 如:n// 1221 對比: 12 和21的翻轉是否相同n//n// 12321 對比:12 123 / 10n// 問題:n// 怎么拿到每位的數字? 循環 r = x%10 x/10n// 怎么翻轉? r*10 + x%10n//n// 時間復雜度 O(N)n// 空間復雜度 O(1)nnfunc isPalindrome(x int) bool {n if x < 0 || (x != 0 && x%10 == 0) {n return falsen }n var r = 0n for x > r {n r = r*10 + x%10n x /= 10n }n return r == x || r/10 == xn}n
two-sum
/**n空間換時間n求兩個數的和等于一個數,就等于查找目標數字和數組里的差是否在數組中。 可以通過hashmap將 O(n) 變O(1)然后一層循環n時間復雜度: N(n)n空間復雜度: N(n)n */nfunc twoSum(nums []int, target int) []int {n var m = make(map[int]int)n m[nums[0]] = 0n for i := 1; i < len(nums); i++ {n var c = target - nums[i]n if n, ok := m[c]; ok {n return []int{n, i}n } else {n m[nums[i]] = in }n }n return niln}n
Review
3個方式編寫簡潔的測試用例
3 easy ways to write cleaner unit tests
- 不要在把多個test在一個function里進行測試。
- 可讀性差
- 模糊不清的狀態,需要推理才能知道你在驗證什么
- 起始狀態不明確
- 起一個有有意義的測試名字
這樣更具有更好的可讀性,而且測試的目的性也更明確。 可以以這個格式起名字
public void testSYSTEM_BEHAVIOR_CONDITION() {
錯誤實例: 這是在驗證什么,誰也不知道
public void testBasicFunctionality() {
正確實例: 讓人一看就知道你要干什么
public void testAuthenticate_rejectsUser_whenBadCredentialsProvided() {
- AAA: Arrange, Act, Assert
- Arrange: 初始化test所需要的環境以及變量。如 mock RPC的返回,模擬填充數據庫等。
- Act: 執行需要驗證的function
- Assert: 驗證是否符合你預期的
按照這個順序去分割你的代碼,使可讀性更強一些.
例子:
public void Pay_returnInsufficient_whenNotEnoughAmountOfUserProvided() {n // Arrange n int totalamount = 100n // 模擬數據庫返回,返回一個小于totalamout的用戶n UserDao userdao = mockUserDaoForSomeNotEnoughAccount(totalamount);n PayService.setUserDao(userdao)nn //Act n // 調用支付方法n PayResult result = PayService.pay(user_id,totalamount)nn // Assert n // 驗證狀態n assertThat(result.status).isEqueis(Insufficient);n}
單元測試還是很重要的,他可以幫住你驗證和梳理你程序的流程、條件等。好的testcese應該讓人知道你在驗證什么,可讀性、目的性要強,同時也方便讓他人進行閱讀。 對自己負責也對其他人負責
Tip
在用grpc做rpc通訊的時候,不像傳統的http可以直接curl請求做測試。 發現了個項目可以用curl的方式調用grpc在此分享一下。
grpcurl -d '{"id": 1234, "tags": ["foo","bar"]}' n grpc.server.com:443 my.custom.server.Service/Method
https://github.com/fullstorydev/grpcurl
Share
最新在看linux性能優化實戰,補一些基礎的知識,先有個概念,然后在買書深入學些下。把學到一些知識點分享一下。
系統在變慢的時候,首先看下機器的負載情況。
通過top和uptime可以查看平均負載
$ uptimen11:07:56 up 546 days, 22:43, 2 users, load average: 3.12, 3.15, 3.35n# 上邊是過去1、5、15分鐘的平均負載
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.
系統平均負載簡單來說就是就是單位時間內,系統正在處理runnable狀態的和不可中斷狀態的進程。
runnable狀態: 正在使用CPU的進程和等待使用CPU的進程。
不可中斷狀態: 正在等待IO處理的進程。 是系統對進程和硬件的一種保護機制,保證在回寫的時候不會被其他進程中斷,進而保護數據。
總結下就是平均負載就是活躍的進程數。是當前IO、CPU、等待進程數的負載情況,所以只看CPU使用率是不能完全代表機器的負載的。
負載超過多少就算高了呢。
一般來說推薦超過70%就算高了. 那怎么計算這個比例呢? 就是平均負載除以CPU核數即可。 獲取CPU核數
$ grep 'model name' /proc/cpuinfo | wc -ln4
我的機器是4核心的。 上邊負載有3個值,看哪個呢? 都要看的其實,3個值表示一個趨勢,比如說過 15分鐘的時候負載是7,1分鐘的負載是3,那說明負載在降低。反之
可以分場景對比下指標
首先安裝systat,其中包含了很多監控系統的工具。 其中mqstat用來查看多核CPU的性能的,pidstat是用來查看進程的運行情況的. 還可以通過stress來模擬IO繁忙和CPU繁忙的狀態,進行對應的對比
yum install -y sysstat stress
CPU密集型
終端1 把一核跑滿
stress --cpu 1 --timeout 600
終端2 可以看到load已經到1了快,如果跑夠一分鐘的話就會變成1了。
uptime 11:37:46 up 292 days, 20:07, 4 users, load average: 0.94, 0.49, 0.23
查看每個CPU的負載情況
mpstat -P ALL 5 1nLinux 3.10.0-693.el7.x86_64 (mall-admin1.cf.bj.tx.lan) 2019年03月23日 _x86_64_ (4 CPU)nn11時34分48秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idlen11時34分53秒 all 25.18 0.00 0.15 0.05 0.00 0.00 0.00 0.00 0.00 74.62n11時34分53秒 0 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60n11時34分53秒 1 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80n11時34分53秒 2 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40n11時34分53秒 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00nn平均時間: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idlen平均時間: all 25.18 0.00 0.15 0.05 0.00 0.00 0.00 0.00 0.00 74.62n平均時間: 0 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60n平均時間: 1 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80n平均時間: 2 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40n平均時間: 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
可以看到CPU利用率25% CPU3 被用到了100%
查看哪個進程負載比較高
pidstat -u 5 1nLinux 3.10.0-693.el7.x86_64 (mall-admin1.cf.bj.tx.lan) 2019年03月23日 _x86_64_ (4 CPU)nn11時41分29秒 UID PID %usr %system %guest %CPU CPU Commandn11時41分34秒 0 4696 100.00 0.00 0.00 100.00 3 stressn11時41分34秒 0 12487 0.40 0.00 0.00 0.40 1 barad_agentnn平均時間: UID PID %usr %system %guest %CPU CPU Commandn平均時間: 0 4696 100.00 0.00 0.00 100.00 - stressn平均時間: 0 12487 0.40 0.00 0.00 0.40 - barad_agent
可以看到是我們的stress把把CPU用到了100%
下邊基本上就是上邊的這幾個指標不同的變,我大概說下數據就不補了,有興趣的同學直接按照上面的命令查看就行
IO密集型
stress -i 1 --timeout 600
負載仍然是1 查看指標的時候會看到%iowait的總值到100%
大量進程場景
stress -c 8 --timeout 600
負載是8 已經嚴重超標了 %CPU 50%








