我正在对ElasticSearch进行基准测试,以实现非常高的索引吞吐量目的.
我目前的目标是能够在几小时内索引30亿(3,000,000,000)个文档.为此,我目前有3台Windows服务器机器,每台机器有16GB RAM和8个处理器.正在插入的文档具有非常简单的映射,仅包含少数非分析的数字字段(_all已禁用).
我能够使用这个相对适中的装备每秒达到大约120,000个索引请求(使用大桌面进行监控),我相信可以进一步提高吞吐量.我正在使用一些.net NEST客户端来发送索引批量请求,批量处理1500个索引操作.
不幸的是,每秒120k请求的吞吐量不会持续很长时间,并且速率逐渐降低,在几个小时后降至~15k.
监控机器显示cpu不是瓶颈.但是,所有机器上的物理磁盘(而不是SSD)空闲时间似乎都在下降,平均闲置率低于15%.
设置refresh_interval为60s,而不是300s,最后是15m,似乎没什么帮助.在单个分片中监视单个translog,显示translog每30分钟刷新一次,然后达到200MB.
我尝试过使用两种分片策略:
这两种尝试都会产生相当类似的体验,我认为这是有意义的,因为它是相同数量的分片.
看一下这些片段,我可以看到大多数分片都有~30个已提交的片段,以及相似数量的可搜索片段.细分市场规模各不相同 有一段时间,尝试使用max_num_segments = 1来优化索引,在完成之后似乎有所帮助(花了很长时间).
在任何时候,从一开始就开始整个摄取过程,在删除使用过的索引并创建新索引之后 - 导致相同的行为.最初的高指数吞吐量,但逐渐减少,早在达到30亿文件的目标之前.此时的索引大小约为120GB.
我正在使用ElasticSearch 1.4版本.Xms和Xmx配置为8192MB,可用内存的50%.索引缓冲区设置为30%.
我的问题如下:
我正在努力在延迟,带宽和吞吐量之间划清界限.
有人可以用简单的术语和简单的例子来解释我吗?
我正在Linux上通过串口实现协议.该协议基于请求应答方案,因此吞吐量受到将数据包发送到设备并获得答案所需的时间的限制.这些设备大多是基于arm的,运行Linux> = 3.0.我遇到了麻烦,将往返时间减少到10ms以下(115200波特,8个数据位,无奇偶校验,每个消息7个字节).
什么IO接口会给我最低的延迟:使用ioctl手动选择,轮询,epoll或轮询?阻塞或非阻塞IO是否会影响延迟?
我尝试使用setserial设置low_latency标志.但它似乎没有效果.
还有其他我可以尝试减少延迟的事情吗?由于我控制所有设备,甚至可以修补内核,但它首选不要.
----编辑----
串口控制器使用的是16550A.
在研究潜在应用的无线通信协议时,我在维基百科上看到了这个页面,其中列出了蓝牙和802.11网络的吞吐率:http://en.wikipedia.org/wiki/List_of_device_bit_rates
以下是链接中的相关选择:
与Wi-Fi标准相比,为什么蓝牙的吞吐量如此之小?
是否仅仅因为管理机构设定的标准有意设定较低的数据传输速率,以便使硬件成本保持在较低水平?
我们是否有可能获得带宽为802.11a或802.11n的"蓝牙5",或者是否有一些故意的设计决策导致低传输速率(例如牺牲速度以支持低功耗)?
编辑:要清楚,我知道列出的数据速率是理论上的最大值,并不能反映真实世界的性能.
我试图用我自己的话来定义HDFS中的高吞吐量和低延迟意味着什么,并提出了以下定义:
HDFS经过优化,可以更快地访问批量数据集(高吞吐量),而不是该数据集中的特定记录(低延迟)
是否有意义?:)
谢谢!
我开始阅读著名的 Martin Fowler 书(企业应用程序架构模式)
我不得不提一下,我正在阅读翻译成我的母语的书,所以这可能是我误解的一个原因。
我找到了他们的定义(回译成英文):
响应时间- 处理一些外部请求的
时间 延迟- 获得任何响应之前的最短时间。
对我来说也是一样。你能强调一下区别吗?
我们正在开发一种可与iPad配合使用的BLE传感器外设,它需要使用TI CC2541 BLE模块和自定义配置文件的BLE通知特性(无应答)的以下吞吐量数据:
每10ms一个20字节(GATT最大标准数据包),或者因为我们似乎每个连接间隔限制4个数据包,这相当于每40ms一个连接间隔.所需吞吐量为每秒2,000字节,TI网站建议将CC2541 BLE解决方案用于需要此级别数据吞吐量的多个传感器设备.
BLE模块的配置文件设置为最小和最大连接间隔分别为20ms和40ms,这应该足够了."Apple产品的蓝牙配件设计指南"文档表明,我们设置的最小和最大连接间隔如上所述是正确的.我们在新的Mac Mini/Mac Book上使用适用于iOS 6的最新iPad和Apple工具.
通过iPad上的简单测试程序,我们可以使链接能够以20ms的间隔向BLE外设发送20字节数据包,但是一旦我们按需要将其降低到10ms,我们就开始丢失数据包或者获取损坏的数据包,我们有FIFO空中断关闭,因此我们可以更快地处理向BLE模块FIFO的发送,我们使用最大波特率230400将20字节数据包从微处理器发送到BLE TX FIFO.
我们意识到我们处于BLE转移限制的最高端,并且是可能的.任何人都可以建议使用带有最新iPad的TI CC2541 BLE芯片/模块是否有解决方案来实现每秒2000字节的吞吐量?
我需要提高系统的吞吐量.
通常的优化周期已经完成,我们已经实现了1.5倍的更高吞吐量.
我现在开始怀疑是否可以利用cachegrind输出来提高系统的吞吐量.
有人能指点我如何开始吗?
据我所知,我们需要确保最常用的数据应保持足够小,以便它保留在L1缓存中,下一组数据应该适合L2.
这是我正在采取的正确方向吗?
我一直在为Stack Exchange编写Google Chrome扩展程序.这是一个简单的扩展,允许您跟踪您的声誉并获得Stack Exchange站点上的评论通知.
目前我遇到了一些我无法处理的问题.我的扩展程序使用Google App Engine作为后端向Stack Exchange API发出外部请求.对于单个站点上的新注释,扩展中的每个单个客户端请求都会导致对api端点的大量请求,即使对于非剪切用户也可以准备响应.平均用户至少有来自Stack Exchange网络的3个站点的帐户,有些已超过10个!
Stack Exchange API具有请求限制:
单个IP地址每天只能生成一定数量的API请求(10,000).
如果我在5秒内从单个IP地址发出超过30个请求,API将关闭我的请求.
很明显,所有请求应该被限制为每5秒30次,并且目前我已经基于具有memcached的分布式锁实现了请求限制逻辑.我正在使用memcached作为一个简单的锁管理器来协调GAE实例的活动并限制UrlFetch请求.
但我认为限制这样强大的基础设施每5秒发出不超过30个请求是一个很大的失败.这样的api请求率不允许我继续开发新的有趣和有用的功能,有一天它将完全停止正常工作.
现在我的应用程序有90个用户并且还在增长,我需要提出解决方案如何最大化请求率.
众所周知,App Engine通过不同IP的同一池创建外部UrlFetch请求.我的目标是编写请求限制功能,以确保符合api使用条款并利用GAE分布式功能.
所以我的问题是如何在遵守api使用条款和利用GAE分布式功能的同时提供最大的实际API吞吐量.
建议使用另一个平台/主机/代理在我看来是没用的.
google-app-engine throttling rate-limiting throughput google-chrome-extension
throughput ×10
low-latency ×3
bandwidth ×2
latency ×2
performance ×2
bluetooth ×1
c++ ×1
daemon ×1
hadoop ×1
hdfs ×1
ios ×1
linux ×1
peripherals ×1
serial-port ×1
storage ×1
throttling ×1
valgrind ×1
wifi ×1
wireless ×1