【问题标题】:IO performance in windows and linuxwindows 和 linux 中的 IO 性能
【发布时间】:2012-12-22 11:17:01
【问题描述】:

我们想构建一个网络服务来返回一些图像(如谷歌地图图块)。

源数据被组织成esricompact cache format,我们服务的关键是从bundle中读取tiles。

我不知道如何选择平台,windows 或 linux?

据说linux的IO读写性能比windows更好。

但是如果我们选择linux,java是我们唯一的选择,所以我想知道有没有我们应该知道的点来提高linux中的IO读取性能?

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 读取?

【问题讨论】:

  • 捆绑实际上可能是一个糟糕的选择,因为至少需要两次读取才能获取一个对象(一次用于 TOC,一次用于对象)每个文件有一个对象可能会花费一些磁盘空间,但会减少缓冲区占用。 Linux 的磁盘缓冲以及 inode 和目录缓存可以轻松处理数以千计的小文件,所有文件都驻留在磁盘缓冲区中。可能需要将目录的大小限制在一百个以内(例如,通过使用对象名称/编号的前几个字母作为子目录名称)

标签: linux io


【解决方案1】:

您必须在您的环境中拥有 Windows 服务器的唯一情况是当您选择 MS SQL Server DBMS(它几乎是 Sybase 但更便宜),在这种情况下为 DB 和 *nix 服务器配备 Windows 框中层。

在很多情况下都可以使用 Windows。从声明“必须拥有 Windows”开始,揭示了一种现有的偏见,然后是许多毫无根据的声明。但至少你清楚地认识到了这一点。

Java 是毫秒级中间件的最佳技术,主要针对大量可用的成熟标准化开源技术。从编码(Eclipse、NetBeans、Idea)到手动(ant、maven)和自动(teamcity、hudson/jenkins)构建、测试、静态代码分析的一切都在那里,是标准化的,是开源的,并且有数百万的支持规模社区。​​p>

我觉得有必要说 Visual Studio/C#(因为提到了 OP 作为替代方案)提供了您上面提到的所有内容,但开源除外。也就是说,.NET Framework(或 .NET Core)现在是开源的。获取信息here。根据您的上述评论,我想我可以得出结论,唯一可行的解​​决方案可以通过开源社区获得。

我曾经听说过这句话很有道理:“只有当你的时间一文不值时,它才是免费的。”

此外,计算整个开源社区是一个虚假的论点。您必须使用一种开发工具/API 并将社区支持与另一种进行比较。例如,比较 Visual Studio 与 Eclipse 的社区规模/质量。或者 .NET Framework 与 Java 的对比。

顺便说一句,我没有体验过比 Visual Studio/Windows 更好的智能感知实现。当 Eclipse 工作时,您必须依赖您引用的开源库的质量才能获得任何有意义的东西。我发现 .NET Framework 需要比 Java 更少的 3rd 方库来实现相同的目标。

Linux 是性能、稳定性、易于维护和开发环境质量方面最好的服务器端平台 - 一个极其强大的基于命令行的 IDE。您可以期望 Linux 服务器的正常运行时间长达数月,但 Windows 却不行。

自 2014 年 5 月 30 日(将近一年)以来,我们有许多运行“大数据”服务的 Windows 服务器运行服务,并且自 2013 年以来还有更多的服务器不间断地运行。我们遇到的唯一一次正常运行时间问题是硬件老化/故障或我们编写的应用层软件包含错误。

Tomcat/Servlet(或 Jetty/Servlet)是许多金融机构的经典工业组合,其中稳定性是第一要务。

也使用IIS:job posting for IIS developer at financial institution

最后,IO 性能问题:高质量的用户空间非阻塞 IO 代码将受到 CPU 和硬件带宽的限制,因此操作系统不是决定因素。虽然像中断关联、线程固定、实时调整、内核绕过等花哨的东西我相信在 Linux 上更容易实现。

这些变量中的大多数是由每个操作系统定义的。听起来您在线程方面有很多经验,但我认为开发人员可以在两种环境中轻松地在应用程序层进行优化。更改线程优先级、实现自定义线程池、配置 BIOS 等都在 Windows 世界中可用。除非您想自定义 Unix/Linux 允许的内核,否则您必须支持您自己的 Unix/Linux 自定义构建。

我认为作为一项规则,不应诋毁或避免商业软件以支持开源。

【讨论】:

    【解决方案2】:

    我知道这听起来可能毫无根据,但除非您必须使用 Windows,否则请使用 *nix。您必须在您的环境中使用 Windows 服务器的唯一情况是当您选择 MS SQL Server DBMS(它几乎是 Sybase,但更便宜)时,在这种情况下为 DB 使用 Windows 机器,为中间层使用 *nix 服务器.

    Java 是毫秒级中间件的最佳技术,主要针对大量可用的成熟标准化开源技术。从编码(Eclipse、NetBeans、Idea)到手动(ant、maven)和自动(teamcity、hudson/jenkins)构建、测试、静态代码分析的一切都在那里,是标准化的,是开源的,并且有数百万的支持规模社区。​​p>

    Linux 是性能、稳定性、易于维护、开发环境质量最好的服务器端平台 - 一个极其强大的基于命令行的 IDE。您可以期望 Linux 服务器的正常运行时间长达数月,但 Windows 却不行。

    Tomcat/Servlet(或 Jetty/Servlet)是许多金融机构的经典工业组合,其中稳定性是第一要务。

    最后,IO 性能问题:高质量的用户空间非阻塞 IO 代码将受到 CPU 和硬件带宽的限制,因此操作系统不是决定因素。虽然像中断关联、线程固定、实时调整、内核绕过等花哨的东西我相信在 Linux 上更容易实现。

    【讨论】:

    • 其实我个人更喜欢linux,那么有没有什么地方需要我们知道才能获得更好的性能(我的意思是对客户端的快速响应时间),例如我们需要使用队列吗? ?
    • @hguser - 不确定你所说的“队列”。假设您要使用 Java,并且性能意味着最佳吞吐量(相对于最低延迟),那么最好的选择是使用基于非阻塞 epoll 的单线程 IO 循环,由固定大小的线程池执行器支持(繁忙线程的总数应该是盒子上 CPU 内核数量的函数)。更喜欢原子和非阻塞同步原语而不是阻塞同步原语。确保控制在运行时分配的对象数量,喜欢基类型而不是盒装,使用原生数组而不是集合,等等。
    • :感谢您的关注和重播。:)。通过您的 cmets,我知道我的“队列”是指“线程池”。其实你的很多词我都没听过,比如“epoll”,“threads pinning”……有什么快速入门的文档吗?
    • @hguser - :),epoll() 是一个 linux 系统调用,它允许单个线程对多个描述符进行 IO 并由描述符就绪驱动,与 Windows 上的 WaitForMultipleObjects() 相同。线程锁定是将线程附加到单个 CPU,用于上下文切换优化和更好的系统确定性。固定通常与忙等待风格的编程相结合。
    • 我更新了我的帖子以公开我们处理请求所需的过程的一些细节。我想知道你是否可以向我推荐一些关于你上面提到的技术的文档或演示?
    猜你喜欢
    • 2023-03-11
    • 2011-04-18
    • 2011-08-01
    • 2011-06-29
    • 2023-03-29
    • 2011-12-06
    • 1970-01-01
    • 2014-12-23
    • 2012-08-06
    相关资源
    最近更新 更多