1、背景
因為業務需要,搭建了乙個系統,系統主要由兩部分組成,web頁面和資料庫。
mysql大概2萬條資料,其中有乙個欄位是click_num點選次數,php頁面會取點選次數最小的一條記錄去進行操作,然後update一下click_num這個字段,讓click_num=click_num+1。
2、問題
讀取資料的客戶端有1000個,大概40秒取一次任務,1秒併發25左右,在開始在mysql資料1萬條以內的時候,資料庫完全可以支撐,但是再加到了2萬條資料的時候,網頁載入資料的速度就非常慢了,檢視cpu,發現伺服器的cpu已經100%了。於是進行機器公升級,公升級到下面的配置
發現稍微好了一點點,但是cpu還是高達70%,load負載也非常大。
於是還想公升級伺服器,但是去檢視阿里雲,發現這個已經是頂配了,沒有機會再公升到更高的配置了,於是開始想著怎麼從技術角度去優化。
3、發現問題
那麼就開始檢視問題,首先去判斷了一下apache的http連線。
開始想了很多辦法,以為是tcp連線太多出的問題,後面繼續排查,發現瓶頸在資料庫。
於是用
show processlist;
發現有很多查詢卡主了,導致有400多個連線,連線總數一共才400,就導致後面的請求根本無法進來,重點的語句就這乙個
select * from down where engine='clientbd' and state =1 and ownsign='gold' order by click_num asc,update_date asc limit 1
1這個語句的意思,就是從資料庫中查詢出click_num最小的一條資料。而資料庫的表中,2萬條資料,其中click_num是有大量相同的最小值的,而且這個字段不斷變化,因此也無法設定主鍵,因此全文排序導致該搜尋異常緩慢。
4、非同步化
其實技術方面去考慮,我每次只需要隨機取click_num最小的一條記錄,沒有必要每次都進行一次檢索排序,那麼我是不是可以非同步去處理?使用乙個排程程式,5秒鐘就把最小的100個值單獨取出來,存到乙個新的表中,然後頁面在這個100個值的頁面把資料取出來,然後再根據id更新主表中的資料。
更新主表是使用主鍵id,會非常快。
update down set click_num=click_num + 1,update_date = '".date("y-m-d h:i:s",time())."' where id = ".$id
15、實施
排程程式採用tbscheduler,發現後面全部正常。
cpu
伺服器負載
nginx高併發系統優化基礎
1 系統層面優化 在系統核心檔案修改 etc sysctl.conf auto enabled by xs tools install.sh net.ipv4.conf.all.arp notify 1 net.ipv4.ip forward 1 net.bridge.bridge nf call ...
高併發優化
前台優化 1 減少http請求 css檔案合併 js檔案合併 2 壓縮js css檔案 3 使用雪碧圖 4 懶載入 只載入看到的第一屏內容,下拉之後看到其他的內容 5 預載入 載入預設圖 6 避免css樣式表示式 7 避免空的src 8 調整大小 9 cdn加速 1 頁面靜態化 2 負載均衡 集群 ...
高併發優化
1 前台優化 減少http請求 css檔案合併 js檔案合併 壓縮js css檔案 使用雪碧圖 懶載入 只載入看到的第一屏內容,下拉之後看到其他內容 預載入 載入預設圖 避免css樣式表示式 cdn加速 2 服務端優化 頁面靜態化 負載均衡 集群 分布式使用佇列 3 優化 用單引號代替雙引號,雙引號...