似乎所有主要投资银行都在Unix(Linux,Solaris)中使用C ++来实现低延迟/高频服务器应用。为什么Windows通常不用作此平台?是否有技术原因导致Windows无法竞争?
答案 0 :(得分:15)
用于算法交易的极低延迟系统的性能要求是 extreme 。在这种环境中,微秒计数。
我不确定Solaris,但Linux的情况下,这些人正在编写并使用低延迟补丁和整个内核的自定义,从网卡驱动程序开始。并不是因为技术原因导致无法在Windows上完成,而是有一个实际/合法的 - 访问源代码,并能够通过更改重新编译它。
答案 1 :(得分:12)
从技术上讲,没有。但是,有一个非常简单的商业原因:其余的金融世界都在Unix上运行。银行在AIX上运行,股票市场本身在Unix上运行,因此,在金融世界中找到习惯于Unix环境而不是Windows环境的程序员会更容易。
答案 2 :(得分:10)
(我在投资银行工作了8年) 实际上,很多银行称之为低延迟的东西都是用Java完成的。甚至不是实时Java - 只关闭了GC的普通Java。这里的主要技巧是确保你已经运行了足够的所有代码,以便在将特定的VM切换到prod之前运行jit(因此你有一些运行几分钟的启动循环 - 以及热故障转移)
使用Linux的原因是:
熟悉
远程管理仍然更好,影响也很小 - 它对机器上的其他进程影响很小。请记住,这些系统通常位于交易所,因此指向机器的链接(来自您/您的支持团队)可能会比您的普通数据中心更糟。
可调性 - 将swappiness设置为0,让JVM预分配大页面以及其他低级别技巧的能力非常有用。
我确信你可以让Windows工作得令人满意,但这样做并没有什么大的优势 - 正如其他人所说的那样,你挖走的任何员工都必须重新发现他们所有的延迟破坏技巧而不是仅仅运行一份清单
答案 3 :(得分:4)
Linux / UNIX对于并发远程用户来说更加实用,可以更容易地在系统中编写脚本,在日志上使用grep / sed / awk / perl / ruby / less等标准工具... ssh / scp ...那些东西就在那里。
还存在技术问题,例如:要测量Windows上的已用时间,您可以在基于Windows时钟标记的一组函数和基于硬件的QueryPerformanceCounter()之间进行选择。前者每10到16毫秒递增一次(注意:一些文档意味着更高的精度 - 例如GetSystemTimeAsFileTime()的值测量到100ns,但它们报告时钟滴答的相同100ns边缘,直到再次滴答)。后者 - QueryPerformanceCounter() - 具有显示停止问题,其中不同的内核/ cpus可以报告时钟 - 自启动以来由于在系统引导期间的不同时间被预热而相差几秒。 MSDN将此记录为可能的BIOS错误,但这很常见。那么,谁想在一个无法正确检测的平台上开发低延迟交易系统? (有解决方案,但你不会在boost或ACE中找到任何方便的软件)。
许多Linux / UNIX变体都有许多易于调整的参数,可以将单个事件的延迟与负载下的平均延迟,时间片大小,调度策略等进行权衡。在开源操作系统上,还有保证随附当你认为某些东西应该比它更快时,能够参考代码,以及一个(可能是巨大的)社区已经并且正在批判地这样做的知识 - 对于Windows来说,它显然主要是那些人。重新分配来看它。
在FUD /声誉方面 - 有些无形但是操作系统选择的重要原因 - 我认为业内大多数程序员都会更信任Linux / UNIX以提供可靠的调度和行为。此外,尽管Windows目前非常可靠,Linux / UNIX的声誉也越来越低,Linux的代码库比Solaris或FreeBSD更易变。
答案 4 :(得分:4)
原因很简单,10到20年前,当这样的系统出现时,“硬核”多CPU服务器只能在某种UNIX上运行。如今,Windows NT处于幼儿园。所以原因是“历史性的”。
现代系统可能是在Windows上开发的,现在只是品味问题。
PS:我当前正致力于其中一个系统:-)答案 5 :(得分:2)
有多种原因,但原因不仅仅是历史原因。事实上,似乎越来越多的服务器端金融应用程序在这些日子里运行* nix(包括伦敦证券交易所等大型公司,他们从.NET平台转换)。对于客户端或桌面应用程序,定位Windows以外的任何东西都是愚蠢的,因为这是已建立的平台。但是,对于服务器端应用程序,我在部署的大多数地方部署到* nix。
答案 6 :(得分:2)
我部分同意上面的大部分答案。虽然我已经意识到使用C ++的最大原因是因为使用非常庞大的STL库它相对更快。
除此之外,linux / unix系统也用于提升性能。我知道许多低延迟团队会调整linux内核。显然,Windows不提供这种自由度。
遗留系统,许可证成本,资源数量等其他原因也是较少的驱动因素。正如“rjw”所提到的,我见过团队使用Java以及修改过的JVM。
答案 7 :(得分:0)
我的历史和访问内核操作的意见。
除了这些原因,我还认为,就像他们在一些低延迟中使用这些技术时,他们如何关闭.NET的垃圾收集和Java中的类似机制。它们可能会避免使用Windows,因为API处于高级别,它与低级别的操作系统和内核进行交互。
所以核心当然是可以使用低级操作系统进行交互的内核。提供高级API只是为了让普通用户的生活更轻松。但是在低延迟的情况下,这结果是每个操作周围的脂肪层和分数损失。因此,每次通话获得几分之一秒的利润丰厚的选择。
除此之外,另外需要考虑的是整合。大多数服务器,数据中心,交换机使用UNIX而不是Windows,因此使用同一系列的客户端可以使集成和通信更加容易。
然后你有安全问题(虽然很多人可能不同意这一点)与黑客攻击WINDOWS相比,攻击UNIX并不容易。我不同意许可必须是银行的问题,因为它们会在每一件硬件和软件以及定制它们的人身上花钱,因此购买许可证时,如果考虑通过购买获得的收益,问题就不会那么大。 / p>