1 问题现象图1. sql部分执行计划通常情况下此类问题是由客户感知到某业务突然变慢发现的通过打印执行计划可以看到Stream算子的执行时间占大部分如图1所示则为通信性能问题。2 排查一网卡多队列通常情况下每张网卡有一个队列所有收到的包从这个队列入内核从其中取数据处理如果取数据不及时则会存在丢包的情况。一个CPU处理一个队列的数据这个叫中断默认是CPU0处理一旦流量特别大此CPU负载很高性能存在瓶颈。所以需要配置网卡多队列即一个网卡有多个队列收到的包根据TCP四元组信息hash后放入其中一个队列后面该连接的所有包都放入该队列每个队列对应不同的中断使用irqbalance将不同的中断绑定到不同的核充分利用了多核并行处理特性提高了效率。可使用gs_check -i CheckMultiQueue命令进行排查若此项未通过则可使用gs_check -i CheckMultiQueue --set命令修复。也可使用脚本工具get_irq_affinity.sh检查如图2从右向左看每一位表示一个16进制第一位的1表示在第1个核上即CPU02表示在第2个核上4表示第3个核上以此类推。此网卡共绑定了5个核可以使用ethtool命令查看如图3可设置的最大队列为64当前设置队列为8。图2. 网卡多队列检查结果图3. ethtool命令查看队列情况同样set_irq_affinity.sh脚本用于进行相应的绑定使用ethtool命令调整队列的大小如图4再进行绑核-d指定网卡-c指定绑定的核序列号可连续也可不连续如图5。图4. 设置网卡队列大小图2. 设置网卡多队列3 排查二网络流量对于一些高并发、大数据量通信的场景网卡带宽可能是瓶颈。使用ethtool 网卡名可以看到网卡的规格同时使用sar -n DEV 1命令或gsar脚本观察网络流量情况若达到上限则需要从业务侧考虑降低并发等。若此时流量与网卡上限相差很大可以尝试使用speed_test工具压测观察流量是否存在瓶颈。如图6、7此时万兆网卡发送速度已至上限。图6. speed_test压测情况图7. sar命令查看网络流量如果无法达到上限可观察是否存在重传/丢包现象若存在可根据《GaussDB网络重传丢包故障定位总结》排查。4 排查三通信库内存由于通信库内存配置引发的性能问题是排查的一个重要方向。在各个DN节点上其通信内存受参数comm_usable_memory限制其默认值是4000MB其主要包含两大方面一是为数据结构分配的另一个是逻辑连接的buffer。对于数据结构分配的内存受参数comm_max_datanode和comm_max_stream控制计算公式为256byte * comm_max_datanode * comm_max_stream。若这两个参数设置过大则buffer可申请的内存会变小。当一条sql执行计划中含有多个stream算子时会根据DN情况产生对应的逻辑连接每个连接分配一个buffer初始默认值为2MB如果此时内存是瓶颈则会不断的削减buffer的大小直到8KB为止。当有数据流通过的时候接收端8KB大小的buffer很容易就被占满这个时候流控线程会通知对端的发送线程进行休眠等待应用将数据取走后有足够大小的buffer了再通知对端继续发送。如图8通过strace追踪发送线程与内核之间的交互可以看到每一次发送端发送8192byte的数据后都会等待被唤醒其间耗费了大量的时间导致通信的性能慢。图8. strace追踪发送线程热点图因此对于内存充足的设备可适当的调大comm_usable_memory同时减小不必要的参数comm_max_datanode的大小对于comm_max_stream进行合理的评估后再进行修改。如图9、10可以看到通信库内存为4000MB此时已使用了4701MB查看comm_max_datanode和comm_max_stream均为4096计算得到数据结构分配内存为4096MB已超过最大限制但通信上并不会对此报错只是通过减小buffer限制内存的使用。由于此集群只有80个DNcomm_max_datanode明显设置不合理将其改为128并适当的调大comm_usable_memory的值后通信性能恢复正常。此外数据进入buffer前会占用部分内存空间为保障效率没有每次都进行回收而是由参数comm_memory_pool控制此值可设置为comm_usable_memory的一半。图9. pv_total_memory_detail视图图10. 参数comm_max_datanode和comm_max_stream5 排查四系统调用对于一些CPU、内存、网卡、流量均正常的场景使用strace追踪一下进程的系统调用是一个办法。strace -p lwtid -tt -T -o strace.log将交互信息输出到文件里可以看到每一次通信上的所有调用进而分析问题。6 总结对于通信性能问题本文提供了几种常用方法但实际中并不限于这几方面对于整个链路包括交换机、路由器、网卡等都是可能因素。因此还需不断学习、思考、探索问题最终都将迎刃而解。转载华为云论坛