概 述
Memcached 是一个开源的内存键值数据存储系统,通常用于缓存任意类型的小块数据,如字符串,或数据库和 API 调用结果中的对象。由于其基于内存的特性,Memcached 旨在通过在 RAM 中缓存数据和对象来加速动态 web 应用程序,并减少数据库查找。它是云计算中最具开创性的缓存存储之一,至今仍很受欢迎。
本指南的目的是描述在 Ampere Altra处理器上以最佳方式运行 memcached 的相关技巧。
构建先决条件
实现应用程序的高性能运行,首先要正确构建应用程序并使用适当的编译器标志(flag)。在我们的例子中,当在 Ampere Altra 处理器上构建 memcached 时,我们建议使用 GCC 编译器版本 10 或更新的版本从源代码进行构建。较新的编译器往往对新的处理器特性有更好的支持,并结合了更高级的代码生成技术。
我们使用 CentOS8 作为我们本次优化测试的操作系统。
从 SCL 存储库下载并安装 GCC 10:
sudo yum -y install yum install scl-utils scl-utils-build sudo yum -y install gcc-toolset-10-gcc scl enable gcc-toolset-10 bash
对于其他操作系统,如 Ubuntu 20.04 LTS 和 Debian, GCC 10.2.1 也是可用的,可直接从相应的存储库安装。
Libevent 是构建 memcached 所必需的,可以如下方式下载:
sudo yum install libevent-devel
构建和安装
Memcached wiki 上的安装指南(https://github.com/memcached/memcached/wiki/Install)有关于在 Debian/Ubuntu 和 Redhat/Fedora 上安装 Memcached 的说明。源代码可在 memcached 项目页面上获得。我们建议使用最新的稳定版本。
memcached 项目页面
可以使用以下命令下载 Memcached。
wget https://memcached.org/latest #you might need to rename the file tar -zxf memcached-1.x.x.tar.gz cd memcached-1.x.x
在继续为 Memcached 配置构建选项之前,让我们添加一些特定于 Ampere Altra 处理器的编译器标志:
./configure CFLAGS="-O3 -march=native -mcpu=neoverse-n1" --prefix=/usr/local/memcached make && make test && sudo make install
KERNEL 优化
众所周知,Memcached 占用大量网络资源,为了获得良好的性能,内核和网卡(NIC)的调优是必要的。
大多数内核调优配置可以通过 sysfs 文件系统修改数据结构来设置。但是,有些调整可能需要重新编译内核。一般的内核优化措施是设置操作系统使用 64 KB 的页面大小。这将提高 Ampere Altra 处理器上的翻译暂置缓冲区(TLB)的效率。
查看系统上正在使用的页面大小:
getconf PAGESIZE
对于 64 KB 的页面大小,预期返回值 65536。如果不是这样,请检查 CONFIG_ARM64_64K_PAGES 是否已应用于内核配置文件,重新编译并安装内核,然后重新启动。
CONFIG_ARM64_64K_PAGES=y
TUNED PROFILES
考虑到大量的内核配置选项,有时使用预定义的优化配置文件来匹配您的使用场景会更容易。Tuned 就是这样一种调优服务,它可以通过设置调优配置文件来配置操作系统来提高性能。
以 CentOS 8 为例,如果 Memcached 的吞吐量是所关注的主要指标,我们建议使用吞吐量-性能(throughput-performance)的 Tuned Profile。该配置文件将 CPU 调控器(governors)设置为性能模式,这样可以减少调度延迟,最大化 I/O 吞吐量,并减少交换度值(swappiness),所有这些都可以显著提高性能。
对于 Ubuntu,如果它不是操作系统安装的一部分,则可能需要单独安装 tuned profile。
sudo apt-get update -y sudo apt-get install -y tuned
为了改进 Ampere Altra 处理器上的内核调度延迟,我们建议通过更新 Tuned Profile 文件中的相应设置,将 sched_wakeup_granularity_ns 更改为 5000。
PROFILE_FILE=/usr/lib/tuned/throughput-performance/tuned.conf sed -i 's/sched_wakeup_granularity_ns = 15000000/sched_wakeup_granularity_ns = 5000/g' $PROFILE_FILE
然后使用以下命令启用吞吐量-性能(throughput-performance)的 Tuned Profile:
tuned-adm profile throughput-performance
网络设置
像 Memcached 这样的应用程序通常被调优为在高吞吐量下运行,同时保持严格的服务水平协议(SLA)。p.99 延迟通常是一个常见的标准。为了考虑此类 SLA 的要求,我们建议调优内核 TCP/IP 设置,因为传入的请求是通过 TCP 连接建立的。
我们在 Memcached 测试中使用的 TCP/IP 调优设置列表如下:
echo 9999999 > /proc/sys/net/core/somaxconn echo 4194304 > /proc/sys/net/core/rmem_max echo 4194304 > /proc/sys/net/core/wmem_max echo 4194304 > /proc/sys/net/core/rmem_default echo 4194304 > /proc/sys/net/core/wmem_default echo "4096 87380 4194304" > /proc/sys/net/ipv4/tcp_rmem echo "4096 87380 4194304" > /proc/sys/net/ipv4/tcp_wmem echo "4096 87380 4194304" > /proc/sys/net/ipv4/tcp_mem echo 250000 > /proc/sys/net/core/netdev_max_backlog echo 50 > /proc/sys/net/core/busy_read echo 50 > /proc/sys/net/core/busy_poll echo 3 > /proc/sys/net/ipv4/tcp_fastopen echo 0 > /proc/sys/kernel/numa_balancing echo 0 > /proc/sys/net/ipv4/tcp_timestamps echo 1 > /proc/sys/net/ipv4/tcp_low_latency echo 0 > /proc/sys/net/ipv4/tcp_sack echo 1 > /proc/sys/net/ipv4/tcp_syncookie
除了内核 TCP/IP 设置之外,我们还需要确保应用程序能够利用大多数网卡(NIC)内置的硬件卸载功能,例如 Generic-Receive-Offload,它可以聚合属于同一流的多个传入数据包,以及 large - receive - offload,它可以将属于同一连接的传入 TCP/IP 数据包合并到一个大的接收段中,然后将其传递给内核。
具体操作如下:
ethtool -Kgro on ethtool -K lro on
对于像 Memcached 这样的网络绑定(network-bound)工作负载,强烈建议将网卡中断(irq)分布在多个核心上,以避免出现瓶颈。参考文档 2 是关于 SMP IRQ 关联的一个非常好的参考。
建议使用以下命令检查网卡支持的硬件通道数量,以确保通道数量与网卡的通道容量匹配:
ethtool -lsudo ethtool -L combined
MEMCACHED 配置
Memcached 本身是可以做些调优来更好地匹配实际应用环境。调优它的一个很好的起点是 Memcached 内置的统计功能。可以通过使用 telnet 连接到 memcached 并运行它来研究统计数据:
telnet localhost 11211 Connected to localhost. Escape character is '^]'. telnet> stats STAT pid 23599 STAT uptime 675 STAT time 1211439587 STAT version 1.2.5 STAT pointer_size 32 STAT rusage_user 1.404992 STAT rusage_system 4.694685 STAT curr_items 32 STAT total_items 56361 STAT bytes 2642 STAT curr_connections 53 STAT total_connections 438 STAT connection_structures 55 STAT cmd_get 113482 STAT cmd_set 80519 STAT get_hits 78926 STAT get_misses 34556 STAT evictions 0 STAT bytes_read 6379783 STAT bytes_written 4860179 STAT limit_maxbytes 67108864 STAT threads 1 END
get_hits 和 get_misses 值特别重要,它们可用于计算 Memcached 的缓存命中/未命中比率。像 Memcached 这样的内存缓存的经验法则是将缓存命中率保持在 90% 以上。
清除值(evictions value)计算从缓存中清除的未过期项的数量,以便为新项腾出空间。清除次数过多可能表明缓存过度使用或分配的内存量不足。
最后,Memcached 线程的数量可能是影响 Memcached 总体性能的一个设置。对于像 Ampere Altra 系列处理器这样的高核数处理器,我们建议在研究性能扩展时增加线程数量以使用尽可能多的核。极高的线程数可能导致锁争用,从而降低性能。在启动 Memcached 时,可以通过使用 -t 选项来更改线程数。
在生产环境中对 Memcached 这样的应用程序进行微调需要对其用法和端到端软件堆栈有深入的了解。我们希望本指南中讨论的设置可以帮助提高 Memcached 的性能,并建议参考这里提供的所有配置选项,以更好地匹配您的使用。
全部0条评论
快来发表一下你的评论吧 !