2012-12-22 43 views
1

我們想要構建一個web服務來返回一些圖像(如谷歌地圖瓷磚)。在Windows和Linux的IO性能

而源數據組織爲esri compact cache format,我們服務的關鍵是從包中讀取圖塊。

我不知道如何選擇平臺,Windows或Linux?

據說linux的bettor IO讀寫性能比windows的好。

但是java是我們唯一的選擇,如果我們選擇linux,所以我想知道是否有任何我們應該知道的要提高IO讀取性能在linux?

PS:

在的Winodws平臺,我們將構建基於使用C#.NET4的服務,部署服務使用IIS。

在linux中,我們將使用java(可能基於spring mvc或其他一些mvc框架)構建服務,並使用tomcat部署服務。

更新:

我們可以有以下來源緊湊的文件在不同的摺疊:

L1 
    RxxCxx.bundle 
    RxxCxx.bundlx 
L2 
    RxxCxx.bundle 
    RxxCxx.bundlx 

而來自客戶端的請求可能看起來像這樣:

http://ourserver/maptile?row=123&col=234&level=1.png 

對於這個要求,我們將會進入到L1的摺疊水平爲1,然後讀取RxxCxx.bundlx文件,因爲這個文件是直到告訴我們渲染圖像數據的位置(RxxCxx.bundle的偏移量和長度)的元數據(row=123&col=234),那麼我們將根據偏移量和長度讀取RxxCxx.bundle。然後我們通過將數據寫入響應並將內容類型設置爲「image/png」或其他內容來將數據呈現給圖像。

這是一個完整的處理請求。

然後我想知道是否有任何文檔或存在的演示可以告訴我如何處理這些類型的IO讀取?

+0

捆綁可能實際上是一個不錯的選擇,因爲*至少需要兩次讀取才能獲取對象(一個用於TOC,一個用於對象)每個文件有一個對象可能會花費一些磁盤空間,但會減少緩衝區腳印。 Linux的磁盤緩衝和inode以及目錄緩存可以輕鬆處理數千個小文件,全部駐留在磁盤緩衝區中。保持一個目錄的大小限於一個百分之一(例如,通過使用對象名稱/數字的前幾個字母作爲子目錄名稱) – wildplasser

回答

3

我明白這可能聽起來毫無根據的說法,但除非必須使用Windows,否則使用* nix。在你的環境中必須有Windows服務器的唯一情況是,當你選擇MS SQL Server DBMS(它幾乎是一個Sybase,但是便宜一些),在這種情況下,數據庫有Windows窗口,中間層有* nix服務器。

Java是毫秒級中間件的最佳技術,主要用於大量成熟的可用的開源技術。從編碼(Eclipse,NetBeans,Idea)到手動(ant,maven)和自動(teamcity,hudson/jenkins)構建,測試,靜態代碼分析的所有內容都是標準化的,開放源代碼的,並由數百萬大小社區。

Linux是性能,穩定性,易維護性,開發環境質量的最佳服務器端平臺 - 一個非常強大的基於命令行的IDE。您可以期望從Linux服務器獲得多月正常運行時間,但不能從Windows獲得。

Tomcat/Servlet(或Jetty/Servlet)是許多金融機構的經典工業組合,其中穩定性是首要任務。

最後,IO性能問題:高質量的用戶空間非阻塞IO代碼將被CPU和硬件帶寬綁定,所以OS不會是決定性因素。儘管像中斷關聯,線程固定,通知實時調優,內核旁路等奇特事情我認爲在Linux上更容易實現。

+0

事實上,我個人更喜歡linux,那麼是否有任何我們應該知道的要點爲了獲得更好的性能(我的意思是快速響應客戶端),例如我們是否需要使用隊列? – hguser

+0

@hguser - 不確定你稱之爲「隊列」。假設你打算使用Java,並且性能意味着最佳吞吐量(與最低延遲相反),那麼最好的選擇是使用由固定大小線程池執行程序支持的非阻塞epoll單線程IO循環(佔線程總數是盒子上CPU核心數量的函數)。優先使用原子和非阻塞同步原語來阻止它們。確保保持在運行時分配的對象數量的控制,喜歡基本類型裝箱,本地數組集合等。 – bobah

+0

:感謝您的關注和重播。通過您的評論,我知道我的「隊列」意味着「線程池」。事實上,我從來沒有聽說過像「epoll」,「線程固定」等許多單詞......有沒有快速入門文檔? – hguser

5

在您的環境中必須有Windows服務器的唯一情況是當您選擇MS SQL Server DBMS(它幾乎是一個Sybase,但是更便宜),在這種情況下, *用於中間層的nix服務器。

有很多情況下可以使用Windows。從聲明「必須擁有Windows」開始,揭示了現有的偏見,然後是許多毫無根據的陳述。但至少你清楚地認識到這一點。

Java是毫秒級中間件的最佳技術,主要用於大量成熟的可用的開源技術。從編碼(Eclipse,NetBeans,Idea)到手動(ant,maven)和自動(teamcity,hudson/jenkins)構建,測試,靜態代碼分析的所有內容都是標準化的,開放源代碼的,並由數百萬大小社區。

我覺得有必要說Visual Studio/C#(因爲OP提到的替代方案)提供了上面提到的所有東西,除了是開源的。也就是說,.NET Framework(或.NET Core)現在是開源的。獲取信息here。基於您的上述評論,我認爲我可以得出結論,唯一可行的解​​決方案是通過開源社區提供的。

引用我曾經聽說有很多事實:「只有當你的時間毫無價值時,它纔是免費的。」

此外,統計整個開源社區是一個虛假的論點。您必須採用一種開發工具/ API並將社區支持與另一種進行比較。例如,將Visual Studio的社區大小/質量與Eclipse的大小/質量進行比較。或者.NET Framework與Java的比較。

順便說一句,我沒有經歷過比Visual Studio/Windows更好的智能感知實現。當Eclipse工作的時候,你依賴於你引用的開源庫的質量有什麼意義。我發現.NET Framework需要比Java更少的第三方庫來實現相同的目標。

Linux是性能,穩定性,易用性和開發環境質量的最佳服務器端平臺 - 基於IDE的非常強大的命令行。您可以期望從Linux服務器獲得多月正常運行時間,但不能從Windows獲得。

我們有正在運行的服務處理「大數據」有不中斷系統正常運行時間自2014年5月30日(近一年)和幾個運行2013年以來我們所經歷的唯一一次很多Windows服務器正常運行時問題是硬件老化/失敗或我們編寫的應用層軟件包含錯誤。

Tomcat/Servlet(或Jetty/Servlet)是許多金融機構的經典工業組合,其中穩定性是首要任務。

IIS還用於:job posting for IIS developer at financial institution

最後,在IO性能問題:高質量的用戶空間非阻塞IO代碼將CPU和硬件帶寬約束,所以OS將不被確定因子。儘管像中斷關聯,線程固定,通知實時調優,內核旁路等奇特事情我認爲在Linux上更容易實現。

大多數這些變量是由每個操作系統定義的。這聽起來像你有很多線程的經驗,但我也認爲開發人員可以在兩個環境中輕鬆地在應用程序層進行優化。改變線程優先級,實現自定義線程池,配置BIOS等等都可以在Windows環境中使用。除非你想定製Unix/Linux允許的內核,但是你必須支持你自己定製的Unix/Linux版本。

我不認爲商業軟件應該受到詆譭或避免有利於開源。