前言
AWS EC2除了网络带宽的限制,还有一种Pocket Per Second (PPS)限制。可能在你的网络达到带宽限制前先遇到PPS限制,影响作业和服务的稳定。
PPS超限分为2种:
pps_allowance_exceeded
正常通信的数据包超过限制。这种限制的阈值与EC2的规格相关,规格越高,阈值越高。遇到这种问题,通过可以通过scale up,调高EC2的规格得以解决。
linklocal_allowance_exceeded
访问如下3种服务产生的数据包超限。这种限制的阈值固定,与EC2的规格无关。遇到这种问题scale up并不解决问题,而是需要scale out,增加更多的EC2实例来解决。
DNS服务器
EC2 Metadata Service
时间服务器
之所以说他是隐藏的PPS限制,是因为具体阈值多少,AWS并没有公开,所以无法在文档中找到。你可以通过测试来测定这个阈值,如文章[2]所示;或者咨询AWS Support,当然需要签署NDA才会告诉你。
症状
在实际工作中,我们遇到的更多是linklocal_allowance_exceeded。我们在M5系列的机器上运行Flink作业,偶尔会遇到如下错误:
com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.SdkClientException: Failed to connect to service endpoint
com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [com.amazon.ws.emr.hadoop.fs.guice.UserGroupMappingAWSSessionCredentialsProvider@6c3af9bf: null, com.amazon.ws.emr.hadoop.fs.HadoopConfigurationAWSCredentialsProvider
java.net.UnknownHostException: {mybucket}.s3.{region}.amazonaws.com
建议
对于metadata service的访问限制,我们通过复用AmazonClient,而不是频繁的创建AmazonClient,来减少对metadata service的访问。以AmazonS3为例,我们创建一个单例实例在整个jvm共享,而不是每个s3文件创建一个新的AmazonS3。因为它访问S3会先访问EC2的metadata service获取相关的credential,这个credential在同一个client内部会缓存,直到快要过期;但如果频繁创建独立的client,必然会增加对EC2 metadata service的访问。
对DNS访问的频率,可以增加jvm DNS缓存的时间,来减少域名解析的频率。可以通过配置networkaddress.cache.ttl加以配置,通常默认为60秒。
Metadata Service
EC2 Metadata Service是一个只能从你的EC2内部访问的rest AWS服务,里面存储在这个EC2对应的元数据,例如机器名、IP地址、安全组、credential等等。
该服务以固定ip 169.254.169.254提供服务,每个EC2只能访问到该实例自己的信息,例如你可以从EC2内部运行如下命令,获取该EC2的IPv4的地址:
curl http://169.254.169.254/latest/meta-data/local-ipv4
通过如下命令可以获取该EC2绑定的IAM role所对应的credential:
curl http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
更多metadata service可以参考[3]
参考
[1] https://aws.amazon.com/cn/blogs/networking-and-content-delivery/amazon-ec2-instance-level-network-performance-metrics-uncover-new-insights/
[2] https://www.bluematador.com/blog/how-many-packets-per-second-in-amazon-ec2
[3] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html