Apache Ignite缓存put和get很慢

时间:2017-02-23 23:31:27

标签: java apache performance caching ignite

我没有得到我期望使用Apache Ignite DataGrid的性能。我尝试了一些配置更改,但此时不知道如何调查性能瓶颈,并且正在寻求专家帮助。

我使用Apache Ignite使用我调用ByteArray的包装类来缓存字节数组。我的测试代码尝试通过调用多个puts然后从另一个进程多次获取来对缓存性能进行基准测试。我尝试在同一节点和不同节点上运行get进程。我还使用Java HashMap作为我的缓存创建了一个基线性能规范,这具有更好的性能(put为10000x)。

现在,在同一节点上,我得到以下内容: Hashmap缓存,同一节点:放2600 MB / s;获得300 MB / s 点燃相同的节点缓存:放0.4 MB / s;获得2.0 MB / s 点亮缓存,2个节点:放0.3 MB / s;得到0.7 MB / s

我在复制模式下运行它们但是我看到了分区模式的类似结果。我运行多次迭代测试并平均时间。我的节点有25GB内存,我的测试消耗约1GB。我已将VM配置为最大使用10GB。

提前感谢您对此问题的任何见解。

1 个答案:

答案 0 :(得分:1)

首先,将Ignite性能与HashMap进行比较并不是很有意义。 Ignite是一个分布式和可扩展的系统,而HashMap甚至不是线程安全的。

您使用private void dtGrid_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { int intKeyValue; try { if (dtGrid.CurrentColumn.DisplayIndex == 1) { if (e.Key == Key.Enter || e.Key == Key.Return || e.Key == Key.Tab || e.Key == Key.NumLock) { SendKeys.SendWait("{TAB}"); } else { intKeyValue = GetNumericValue(e.Key.ToString()); if (e.Key == Key.LeftShift || e.Key == Key.RightShift || e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl) { e.Handled = true; } else { if (intKeyValue < 0 || intKeyValue > 9) { System.Windows.MessageBox.Show("Only numbers are allowed."); e.Handled = true; } } } } } catch (Exception ex) { string strMsg = "Error occured in Start Row key event. "; System.Windows.MessageBox.Show(strMsg + ex.Message); //throw new NotImplementedException(); } } private void dtGrid_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) { e.Handled = true; UpdateRowSize(); } private void UpdateRowSize() { DataTable dtFieldSizes = new DataTable(); int intRowSize; string strTotalRowSizeData; string[] strRowSizeInfo; try { intRowSize = 0; dtGrid.UpdateLayout(); dtFieldSizes = ((DataView)dtGrid.ItemsSource).ToTable(); for (int intRowCnt = 0; intRowCnt < dtFieldSizes.Rows.Count; intRowCnt++) { intRowSize += Convert.ToInt16(dtFieldSizes.Rows[intRowCnt]["Size"]); } strTotalRowSizeData = lblRowSize.Content.ToString(); strRowSizeInfo = strTotalRowSizeData.Split(':'); if (Convert.ToInt16(strRowSizeInfo[1]) != intRowSize) { lblRowSize.Content = strRowSizeInfo[0] + ": " + Convert.ToString(intRowSize); } } catch (Exception ex) { string strMsg; strMsg = "RefreshRowSize, error '" + ex.Message + "' has occurred."; System.Windows.MessageBox.Show(strMsg); } } 作为基线的事实让我认为您的测试是单线程的。如果您尝试从多个线程/客户端查询Ignite,我相信您会发现更好的吞吐量。

另请注意,使用Ignite意味着通过网络发送数据。你有可能受到速度的限制。