2016-09-22 158 views
70

升級到macOS Sierra後,我似乎遇到了「sbt test」性能問題。在之前的OS X版本中,完成大約需要40-50秒。 macOS塞拉利昂時間比這更高。我做的最後一次是大約15分鐘。編譯時間與'El Capitan'大致相同。Jvm需要很長時間才能解析localhost的IP地址

我是我的團隊中唯一一個嘗試這個新的macOS的人,所以我不知道它是否只發生在我的mac上,或者它是一個普遍問題。

我的同事對Ubuntu的一個類似的問題,它與隨機數生成減慢測試相關 - Slow service response Times : Java SecureRandom & /dev/random

不幸的是,這並沒有爲我工作。最初我在JDK 8u54上嘗試過,然後嘗試更新到JDK 8u102,這並沒有幫助。

P.S.我正在運行Macbook Pro 2015年中期2.8GHz i7,16GB RAM,1TB SSD。

+0

我有同樣的問題 - 很高興我並不孤單 – woolyninja

+0

我正在使用'gradle clean test'並且遇到同樣的問題。 –

回答

216

我有同樣的問題。升級後,Tomcat從15秒延長到6分鐘以初始化春季環境...禁用csrutils並沒有爲我解決問題。

127.0.0.1 localhost mbpro.local 
::1   localhost mbpro.local 

通過在/etc/hosts文件映射到127.0.0.1地址還有::1這樣加入我的Mac主機名(即Macbook.local,或任何你的Mac被調用)解決問題

如果你有興趣,你可以找到關於這個問題,並解決這裏的一些細節: https://thoeni.io/post/macos-sierra-java/

在文章中,我還鏈接到github project,以幫助解決該問題和瓦利約會解決方案。

問題是相關的(我相信)本地主機名稱解析是如何工作的以及java.net.InetAddr類如何檢索地址。我與幾位同事覈實,顯然這並不是每個升級到Sierra的人都會遇到,但我仍在調查這一變化的根源。

無論如何,解決方案與antid0te立即實施和運行的解決方案相同。

+0

同樣的問題......我可以確認,禁用SIP也不適用於我。 – borges

+5

/etc/hosts解決方案適用於我!謝謝! – woolyninja

+0

@thoeni這個完美的作品。只要我改變'/ etc/hosts',運行測試的速度就回到正常:) –

1

我認爲這是新操作系統的一個普遍問題。我有一個類似的問題:我有一個部署到tomcat的Web應用程序。在El Capitan,它在10秒內啓動,現在需要95秒,而客戶端(基於Swing的桌面應用程序)無法連接到它(或者至少需要很多時間)。我認爲這是圍繞網絡通信的問題,因爲一個簡單的測試控制檯應用運行良好。

+1

關閉SIP解決了我的問題。 http://macossierra-slow.com/how-to-disable-sip-rootless-system-integrity-protection/ –

5

我有同樣的問題。我的春季啓動應用程序需要60秒才能在優勝美地上的Sierra上開始25秒。

調試時,我意識到問題來自InetAddress.getLocalHost()。 我更改了我的主機文件,爲127.0.0.1和:: 1添加了我的主機名,現在應用程序的啓動速度與之前一樣快。

+1

嗨,我發現這個高層次的解釋是否有幫助(但仍不清楚MacOS Sierra發佈版本中發生了什麼變化):「當您請求主機名時,JDK將其解析爲IP地址,然後嘗試反向查找那些地址並檢查是否至少有一個結果映射回輸入主機名。這是反向查找,速度很慢。緩慢不限於JVM。如果沒有在/ etc/hosts中進行適當的配置,任何試圖執行這種反向查找的操作系統都會很慢。「(來自https://github.com/spring-projects/spring-boot/issues/7087) – thoeni

-5

這可能是因爲Mac OS Sierra設置方式中存在一些錯誤。嘗試進行所謂的SMC重置或PRAM重置,以查看它是否會修復您的Mac。這些軟件重置並不會損害您的用戶數據。他們可能會要求您在重新啓動後重置系統時間。

但他們可以解決您的問題。您也可以看一些有關Mac OS塞拉利昂故障排除這裏提到的技巧 - http://elcapitanslow.com/mac-os-sierra-slow-what-to-do/

21

正確答案:Jvm takes a long time to resolve ip-address for localhost

對於懶惰的人:

sudo sed -i bak "s^127\.0\.0\.1.*^127.0.0.1 localhost $(hostname)^g" /etc/hosts 
sudo sed -i bak "s^::1.*^::1 localhost $(hostname)^g" /etc/hosts 
sudo ifconfig en0 down 
sudo ifconfig en0 up 
+1

太棒了! – Bob

+0

@camikiller我看到2個不同的主機名值與共享>計算機名稱,請說明使用哪一個? – vikramvi

+0

更好的解決方案是升級您的MacOS @vikramvi – camikiller

2

例如啓用系統偏好設置>共享>遠程登錄,會導致主機名被自動分配一個IP地址。

由於人們在升級後看到問題,所以假設10.12改變了主機名的解析方式是合理的,即至少在10.11時總是解析主機名,而在10.12時僅在啓用了服務時才解析在「系統偏好設置」>「共享」(10.11的人可以確認這一點)。

+0

我已經10.12.5,但是你的解決方案沒有工作。你有哪個版本? – vikramvi

+0

@vikramvi我有10.12.6和我的安裝東西仍然工作描述。在標準的/ etc/hosts文件和共享禁用的情況下,** ping $(hostname)**會失敗,並出現未知的主機錯誤。啓用共享後,主機名將解析爲我的VLAN的IP。 至於Java(8u141),在禁用共享的情況下調用** InetAddress.getLocalHost()**需要5s。啓用共享後,執行時間將降至13毫秒。 – jurajw

+0

感謝您的澄清 – vikramvi

0

將更新安裝到Mac Sierra 10.12 (16A323)之後,這是一個奇怪的問題。在與下面排序問題的主機文件。

::1   localhost <myhostname>.local <--- Was already present 
127.0.0.1 localhost <myhostname>.local <--- Solved the tomcat loading issue 

您可以通過命令$hostname終端隨時隨地獲得MYHOSTNAME

相關問題