[分享] Spigot的一個小BUG
其實我發現這個問題一直都在
只是通常開服者會固定重啟伺服器
所以這個問題相較之下不是很嚴重
不過我相信還是有很多服開著不關也很少重開的
因為我的服也是這樣
所以也察覺到這個問題的嚴重性
相關的內容我也有同步發到spigot的論壇上
不過官方會不會改我就不清楚了
希望可以改掉這個問題
接下來就說一下這到底是什麼問題好了
就是伺服器如果好幾天不關
我的服是4~5天
這個tracker set的大小在我的伺服器裡就會成長到50萬以上
然後在沒玩家的情況下tps只有10左右
timing裡時間的花費則是30~40ms
http://i.imgur.com/K7hvXH5.png
已經超過半個tick了
會LAG不意外?
這個問題我分了2個階段解決
第一階段是track的的平行化
問題是稍微有解決沒錯
但是沒玩家時TPS卻還是降到18左右(use 4 cores)
有玩家就會變成17
但問題是沒有人在線上到底要追蹤啥?
於是我認為應該是這個set裡的entry沒有正確的被刪除所導致
所以第二階段我做了一個全面檢查
目前是在玩家轉換世界時才會觸發這個檢查
因為經過傳送門都會頓我覺得應該沒差吧 XDDD
希望spigot能夠去修正這個問題
如果沒有 我的專案有修正 囧
不過目前還是在觀察階段
之前有確定確實是tracker set太大導致
因為我有測試這個set大於20萬就清空
然後tps一路19以上持續30多天的紀錄
期間玩家登入數跟頻率是差不多的
不過就是一些機關掛點
生物有時會不動這樣 XDDD
希望對大家有幫助
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.20.13
※ 文章網址: https://www.ptt.cc/bbs/Minecraft/M.1494090377.A.EC7.html
推
05/07 14:21, , 1F
05/07 14:21, 1F
推
05/07 20:16, , 2F
05/07 20:16, 2F
→
05/07 20:16, , 3F
05/07 20:16, 3F
→
05/07 20:17, , 4F
05/07 20:17, 4F
→
05/07 20:18, , 5F
05/07 20:18, 5F
→
05/07 20:20, , 6F
05/07 20:20, 6F
→
05/07 20:20, , 7F
05/07 20:20, 7F
→
05/07 20:21, , 8F
05/07 20:21, 8F
→
05/07 20:22, , 9F
05/07 20:22, 9F
→
05/07 20:22, , 10F
05/07 20:22, 10F
→
05/07 20:24, , 11F
05/07 20:24, 11F
推
05/07 20:26, , 12F
05/07 20:26, 12F
推
05/07 20:30, , 13F
05/07 20:30, 13F
→
05/07 20:32, , 14F
05/07 20:32, 14F
→
05/07 20:33, , 15F
05/07 20:33, 15F
→
05/07 20:34, , 16F
05/07 20:34, 16F
推
05/07 20:38, , 17F
05/07 20:38, 17F
→
05/07 20:39, , 18F
05/07 20:39, 18F
→
05/07 20:39, , 19F
05/07 20:39, 19F
→
05/07 20:41, , 20F
05/07 20:41, 20F
推
05/07 20:41, , 21F
05/07 20:41, 21F
→
05/07 20:41, , 22F
05/07 20:41, 22F
→
05/07 20:42, , 23F
05/07 20:42, 23F
→
05/07 20:43, , 24F
05/07 20:43, 24F
→
05/07 20:43, , 25F
05/07 20:43, 25F
→
05/07 20:48, , 26F
05/07 20:48, 26F
→
05/07 20:49, , 27F
05/07 20:49, 27F
→
05/07 20:50, , 28F
05/07 20:50, 28F
→
05/07 20:51, , 29F
05/07 20:51, 29F
→
05/07 20:52, , 30F
05/07 20:52, 30F
→
05/07 20:53, , 31F
05/07 20:53, 31F
推
05/07 20:56, , 32F
05/07 20:56, 32F
→
05/07 20:58, , 33F
05/07 20:58, 33F
→
05/07 20:59, , 34F
05/07 20:59, 34F
→
05/07 21:01, , 35F
05/07 21:01, 35F
→
05/07 21:02, , 36F
05/07 21:02, 36F
→
05/07 21:03, , 37F
05/07 21:03, 37F
→
05/07 21:03, , 38F
05/07 21:03, 38F
推
05/07 21:11, , 39F
05/07 21:11, 39F
→
05/07 21:12, , 40F
05/07 21:12, 40F
→
05/07 21:13, , 41F
05/07 21:13, 41F
→
05/07 21:13, , 42F
05/07 21:13, 42F
推
05/07 21:19, , 43F
05/07 21:19, 43F
推
05/07 21:22, , 44F
05/07 21:22, 44F
→
05/07 21:23, , 45F
05/07 21:23, 45F
→
05/07 21:24, , 46F
05/07 21:24, 46F
→
05/07 21:26, , 47F
05/07 21:26, 47F
→
05/07 21:32, , 48F
05/07 21:32, 48F
→
05/07 22:32, , 49F
05/07 22:32, 49F
推
05/08 08:02, , 50F
05/08 08:02, 50F
推
05/08 10:01, , 51F
05/08 10:01, 51F
→
05/08 10:19, , 52F
05/08 10:19, 52F
推
05/08 13:28, , 53F
05/08 13:28, 53F
→
05/08 15:59, , 54F
05/08 15:59, 54F
推
05/08 23:43, , 55F
05/08 23:43, 55F
推
05/09 02:04, , 56F
05/09 02:04, 56F
推
05/10 10:00, , 57F
05/10 10:00, 57F
→
05/10 12:30, , 58F
05/10 12:30, 58F
→
05/10 12:31, , 59F
05/10 12:31, 59F
→
05/10 22:00, , 60F
05/10 22:00, 60F
可以請教一下是哪一個伺服器嗎?
想研究一下你的硬體跟伺服端的一些設定配置
還有遊戲規則
想比較一下差異
希望最後找到的問題不是卡林說的那個 囧
※ 編輯: softpak (140.116.20.16), 05/11/2017 00:00:18
→
05/11 10:16, , 61F
05/11 10:16, 61F
→
05/11 10:16, , 62F
05/11 10:16, 62F
→
05/11 10:16, , 63F
05/11 10:16, 63F
→
05/11 12:26, , 64F
05/11 12:26, 64F
→
05/11 12:26, , 65F
05/11 12:26, 65F
→
05/11 12:28, , 66F
05/11 12:28, 66F
→
05/11 12:28, , 67F
05/11 12:28, 67F
→
05/11 12:29, , 68F
05/11 12:29, 68F
→
05/11 12:32, , 69F
05/11 12:32, 69F
→
05/11 12:32, , 70F
05/11 12:32, 70F
→
05/11 12:34, , 71F
05/11 12:34, 71F
→
05/11 12:34, , 72F
05/11 12:34, 72F
→
05/11 12:34, , 73F
05/11 12:34, 73F
經過了5天的觀察
確定是tracker set過大的問題
目前這個SET的大小小於10萬
timings 的結果也很正常
http://i.imgur.com/UD8a5Mf.png
就像剛開時的情況
至於觸發累積的機制還是不太明瞭
不過似乎用bungeecord傳送到別的dimention時不會使這個tracker累積
如果只是想單純的解決這個問題
可以選擇在你喜歡的地方
例如實體經過傳送門時來作全面檢查
程式碼如下(EntityTracker.java):
Set<EntityTrackerEntry> remove_untrack = Sets.newConcurrentHashSet();
public void untrackPlayer(EntityPlayer entityplayer) {
Iterator iterator = this.c.iterator();
while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
entitytrackerentry.clear(entityplayer);
}
//remove all untrack here
for (EntityTrackerEntry ete: this.c) {
int exist_count = 0;
for (Entity ent:this.world.entityList) {
if (ent.getId() == ete.hashCode()) {
exist_count++;
}
}
if (exist_count == 0) {
remove_untrack.add(ete);
}
}
this.c.removeAll(remove_untrack);
remove_untrack.clear();
}
綠色部分是新增的
意思是當玩家通過傳送門時比較c這個set裡的entry資料
跟當下world裡entityList的有沒有重複
沒有重複就表示這個entity沒有在運作
把這個entry從清單移除
每個dimention也就是每個wolrd都有各自的tracker清單
所以這樣移除是沒有問題的
感謝收看
※ 編輯: softpak (140.116.16.132), 05/12/2017 09:31:39
Minecraft 近期熱門文章
PTT遊戲區 即時熱門文章
26
56
84
423