Greenplum部署最佳实践-网络篇

Greenplum作为最先进的开源MPP数据库,因其出色的性能,丰富而完善的功能以及对SQL的支持,在大数据处理和分析应用中都有大量部署和应用,支撑着数量众多的关键业务系统,同时也赢得了大量知名的忠实用户。

本篇最佳实践将专注于部署Greenplum MPP数据库在高性能网络系统的设计和实施。

关于硬件性能的基本概念

各种设备/元件的时钟延迟对照:

关于性能的基本原理

为了提高程序运行速度,从如上表格可以总结出下列基本原理:

  • 数据存放位置离寄存器越近,IO开销/延迟越小,性能和效率越高。
  • 数据存放位置离寄存器越远,IO开销/延迟越大,性能好效率越低。

设计Greenplum网络关键点

如上图所示,Greenplum数据库各个节点之间需要经常用到网络进行数据交换,比如下发数据,比如跨节点的数据交换等。

lum数据库各个节点之间需要经常用到网络进行数据交换,比如下发数据,比如跨节点的数据交换等。

由于网络设备所处的位置离寄存器非常遥远,在网路上传输数据的时间相比较于寄存器内存取数据的时间是非常漫长的。所以为了提高系统整体性能,我们在设计网络时也需要遵循如下几个基本原则:

  • 尽量采用高速网络硬件以降低延迟。
  • 尽量降低网络中断的次数。
  • 尽量提高每一个数据包的有效载荷。

实施网络子系统需要注意的问题

  • 我们可以将数据交换网络与应用网络分开,数据网络专门用于节点间通信和传输数据,如下图红色部分所示:
  • 数据交换的专用交换机,即红色部分,以及连接数据网络专用交换机的每个节点上的网卡,尽可能使用高速硬件,如25GB或者40GB。本条原则目的是使用高速硬件,降低节点间的延迟。
  • 现代交换机和网卡,一般都支持巨帧,比如4k,9k,16k;建议设置成网卡和交换机都支持的最大值。如网卡最大支持16k,交换机也支持16k的巨帧,那么可以将交换机的MTU,和每个节点跟交换机相连接网卡的MTU设置为16k。本条遵循尽量减少中断次数,每次有效负荷尽可能有效;MTU设置为16k时,比默认1.5k大10倍,传输同样多的数据,可以减少9倍IO,从而达到提高性能的目的。计算机节点上,可以通过一个简单的脚本设置网卡的帧,我们假设需要改变的网卡叫eth0,并且把脚本放到 /etc/init.d目录。如果是systemd的系统,可以参考其它文档。
cat /etc/init.d/setbigmtu.sh
#! /bin/bash
ip link set eth0 mtu 9000;
[tony@mpp_dev ~]# ethtool -g eth0
Ring parameters for eth2:
Pre-set maximums:
RX:          8192
RX Mini:     0
RX Jumbo:    0
TX:          8192
Current hardware settings:
RX:          256
RX Mini:     0
RX Jumbo:    0
TX:          256
  • 其次需要检查每张网卡片上缓存是多少,尽可能设置成片上支持的最大的缓存,如下图,物理硬件带8k缓存,但是OS设置只能用256bit:

可以为这个网卡设置成8192,比原来降低32倍的IO请求

ethtool -G eth0 rx 8192 tx 8192

如果要永久生效,客气将其放到/etc/modprobe.conf ,假设这是e1000驱动,可以加入如下内容:

alias eth0 e1000
options e1000 RxDescriptors=8192,8192 TxDescriptors=8192,8192
  • 网络堆栈需要有足够的内存,用于缓存数据交换,主要参数在/etc/sysctl.conf中设置,如下:
# allow testing with buffers up to 128MB
net.core.rmem_max = 134217728 
net.core.wmem_max = 134217728 
# increase Linux autotuning TCP buffer limit to 64MB
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# recommended default congestion control is htcp 
net.ipv4.tcp_congestion_control=htcp
# recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1
# recommended for CentOS7+/Debian8+ hosts
net.core.default_qdisc = fq

后记

IO子系统对于MPP数据库应用来说,主要使用网络和磁盘存储子系统,本篇文章仅讨论了网络子系统优化,用户可以根据这个思路,自己尝试优化磁盘存储子系统。比如利用好磁盘上的缓存提高性能,磁盘数据预取等。

关于作者

本文作者是朱贤文,供职于成都文武信息技术有限公司。作者从事信息技术(IT)行业多年,有丰富的理论和实践经验,熟悉PostgreSQL, Greenplum和Oracle数据库,熟悉存储、操作系统和集群。曾在Oracle, Veritas, HP, IBM等公司工作。

关注微信公众号

VMware 中国研发中心