epoll有兩種模式,lt模式 與 et模式。預設情況下是lt模式,由於et模式在高併發,高流量的情況下,處理效率會高於et模式,所以也就採用了et模式。
伺服器一直執行良好,跑幾千機械人也沒有什麼問題。
但突然之間發現,機械人在反覆掉線上線的測試後,會出現一種情況:伺服器端會再也收不到客戶端的連線事件,或者這個連線事件響應會非常慢,而已連線成功的fd讀寫資料是沒有任何問題的。
主要的原因還是因為et模組的**編寫要求比較高,lt模式就像汽車的自動檔,你只要掛上檔,就能把速度搞上去。而et模式有點像汽車的手動檔,任何時候變速都是需要你自己操作的。lt是條件觸發,只要滿足條件,是一直觸發,直到你把它處理完成。而et有點型別是事件觸發,發生了某個事件的時候,他只觸發一次,如果這一次你沒能在邏輯裡寫處理好,那就不會再觸發了,那這個事件的處理就被丟失。
所以我的問題應該還是沒能把et模式用好,最後的解決辦法大概如下,還原回了預設的方式:
bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));
listen(listenfd, listenq);
ev.data.fd=listenfd;
ev.events=epollin;//監聽的fd 用預設的epolllt模式
if(events[i].data.fd==listenfd) //如果新監測到乙個socket使用者連線到了繫結的socket埠,建立新的連線。
setnonblocking(connfd);
ev.data.fd=connfd;
| epollet;
ev.events=epollin;//這裡也用預設的epolllt模式
epoll_ctl(epfd,epoll_ctl_add,connfd,&ev);
}
響應時間優化
業務不停的迭代,加上打工人換了一波又一波,導致很多業務介面特別重,可讀性非常的差。最近專案在重構優化,部分介面平均響應時間在 1.5s 左右,對於使用者體驗來說,非常的不友好。本文旨在提出幾個介面優化的一些常用的辦法。1 優化的準則 一切的前提是業務價值需要。如果沒有足夠的價值,那麼可讀性才是第一,...
Eureka響應時間優化
1 心跳傳送時間間隔 eureka.client.leaserenewalintervalinseconds 2 心跳檢查間隔 eureka.server.evictionintervaltimerinms 3 readwrite 快取 同步到 readonly 快取中的 間隔時間 eureka.s...
APP響應時間和響應速度測試
測試方法 冷啟動 adb shell am start w com.ui.launcherui 絕對路徑,首個activity。dos命令下獲取路徑命令 adb shell dumpsys window w findstr findstr name am是shell中整合的乙個命令,activity...