- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我们试图通过在 Amazon 的 64 位 linux AMI 上运行的 Jgroups 3.1.0-FINAL 在 EC2(大型实例)上设置 Infinispan 时,我们一直看到不一致的网络故障。一个空的缓存开始时很好,似乎可以工作一段时间,但是一旦缓存已满,同步的新服务器会导致缓存锁定。
我们决定滚动我们自己的缓存,但看到了大致相同的行为。同步期间正在交换 10 兆字节,但它们没有被淹没。在应用程序级别存在来回数据 -> 确认对话,但看起来有些消息从未到达远程。
在查看 UNICAST 跟踪日志记录时,我看到以下内容:
# my application starts a cache refresh operation
01:02:12.003 [Incoming-1,mprewCache,i-f6a9d986] DEBUG c.m.e.q.c.l.DistributedMapManager - i-f6a9d986: from i-d2e29fa2: search:REFRESH
01:02:12.003 [Incoming-1,mprewCache,i-f6a9d986] INFO c.m.e.q.c.l.DistributedMapRequest - starting REFRESH from i-d2e29fa2 for map search, map-size 62373
01:02:12.003 [Incoming-1,mprewCache,i-f6a9d986] DEBUG c.m.e.q.c.l.DistributedMapManager - i-f6a9d986: to i-d2e29fa2: search:PUT_MANY, 50 keyValues
# transmits a block of 50 values to the remote but this never seems to get there
01:02:12.004 [Incoming-1,mprewCache,i-f6a9d986] TRACE o.j.p.UNICAST - i-f6a9d986 --> DATA(i-d2e29fa2: #11, conn_id=10)
# acks another window
01:02:12.004 [Incoming-1,mprewCache,i-f6a9d986] TRACE o.j.p.UNICAST - i-f6a9d986 --> ACK(i-d2e29fa2: #4)
# these XMITs happen for over and over until 01:30:40
01:02:12.208 [Timer-2,mprewCache,i-f6a9d986] TRACE o.j.p.UNICAST - i-f6a9d986 --> XMIT(i-d2e29fa2: #6)
01:02:12.209 [Timer-2,mprewCache,i-f6a9d986] TRACE o.j.p.UNICAST - i-f6a9d986 --> XMIT(i-d2e29fa2: #7)
01:02:12.209 [Timer-2,mprewCache,i-f6a9d986] TRACE o.j.p.UNICAST - i-f6a9d986 --> XMIT(i-d2e29fa2: #8)
...
这是我们的 Jgroups stack .我们在运行时将 PING
协议(protocol)替换为我们自己的 EC2_PING
版本,该版本使用 AWS 调用来查找其他候选集群成员。这不是连接问题。
知道为什么有些数据包没有到达目的地吗?
最佳答案
Any ideas why some of the packets are not arriving at their destination?
这是一个需要追踪的有趣问题。它似乎对某些 EC2 实例的影响比对其他实例的影响多。问题在于通过 UDP 在 EC2 实例之间发送大数据包。
缓存同步代码向远程服务器发送了一个约 300k 的大消息,该消息被分段(使用 FRAG2)分成 4 个 60k(默认大小)的数据包和 1 个 43k 的数据包,然后发送到远程服务器。由于某些网络限制,远程框仅接收最后(第 5 条)43k 消息。 6 万条消息从未到达。这似乎只发生在某些主机对之间——其他主机对可以通过大数据包大小进行良好通信。它不是普遍的,这就是我花了很长时间才确定诊断问题的原因。
我最初认为这是 UDP 接收器窗口大小问题并尝试调整它 (sysctl -w net.core.rmem_max=10240000
) 但这没有帮助。查看 tcpdump 显示 60k 数据包没有到达远程主机。只有 43k 数据包是。
解决方案是将片段大小减小到 16k(32k 可能没问题,但我们比较保守)。当数据包在 Amazon 的虚拟网络中传输时,AWS 对数据包大小有一些内部限制,该虚拟网络正在过滤可能超过 50k 的大型 UDP 数据包。默认的 Jgroups 片段大小 (60k) 是大 IMO,可能应该减少到 32k 左右。
我们就此向亚马逊提交了一张票,他们承认了这个问题,但普遍的 react 是他们很难解决。我们已经调整了片段大小并且正在努力,所以票被关闭了。引用票证:
From: Amazon Web Services
This is an update for case XXXXXXXXX. We are currently limited to packet sizes of 32k and below on Amazon EC2 and can confirm the issues you are facing for larger packet sizes. We are investigating a solution to this limitation. Please let us know if you can keep your packet sizes below this level, or if this is severe problem blocking your ability to operate.
We are actively looking into increasing the packet size along with other platform improvements, and apologize for this inconvenience.
关于 EC2 的一些其他评论。首先,我们已经看到同一可用区中的主机需要大于 8 的 TTL。如果您正在使用多播,请确保您的 TTL 设置为 128 或其他。我们最初认为这是问题所在,但最终不是。
希望这对其他人有帮助。
关于java - EC2 上跨 jgroups channel 丢失数据包的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982448/
尽管我的 EC2 实例(带有针对 ECS 优化的 AIM)正在运行 ecs 代理,但容器并未在我的 EC2 中启动。为了确认 ecs-agent 正在我的 EC2 实例上运行,我检查了: ecs 日志
我想在一个任务定义中使用客户端和服务器在 aws ecs 中运行套接字程序。当我使用 awsvpc 网络模式并每次连接到本地主机上的服务器时,我都可以运行它。这很好,所以我不需要知道服务器的 IP 地
我有一个在 AWS ECS 上运行的 Docker 容器。我不想要负载均衡器,因为容器是用来处理 websocket 连接的。 https://aws.amazon.com/getting-start
我想在我的 AWS ECS/Fargate 集群上的公共(public) Docker 镜像中启动交互式 shell,以便从集群内部运行网络/连接测试。 似乎官方的方法是使用 aws ecs run-
我在 ECS Fargate 上托管了一个 Shiny 的应用程序。它运行得相当好,但偶尔在使用该应用程序时它会崩溃。我在事件选项卡中将其追溯到以下内容: service YYYY has start
在 AWS ECS 中创建容量提供程序时。我们正在填充的值 Target capacity %,在超过这个值后我们的集群缩小,但我很好奇当前集群的这个值是如何计算的,如果我想检查当前的是什么集群的值(
在 AWS ECS 中创建容量提供程序时。我们正在填充的值 Target capacity %,在超过这个值后我们的集群缩小,但我很好奇当前集群的这个值是如何计算的,如果我想检查当前的是什么集群的值(
我在 AWS 上设置了具有多个目标组和应用程序负载均衡器的 Fargate ecs 服务。它按预期运行。 然后我尝试使用本教程设置管道 https://docs.aws.amazon.com/Amaz
我有一个运行任务的 ECS 集群服务,可以使用 AWS 控制台查看其 Cloudwatch 日志流。 如何为 awslogs-stream-prefix 设置日期,因为我想按日期识别日志流。 "c
我正在使用两个容器部署 ECS Fargate 任务:1 个反向代理 nginx 和 1 个 python 服务器。对于每个我有一个 ECR 存储库,我有一个 CI/CD CodePipeline 设
我在 AWS ECS 上部署了一个 CloudFormation 堆栈,比如 teststack , 通过命令 aws cloudformation deploy --template-file ./
我这里有一些具体的用例。我需要自动扩展在 ECS Fargate 上运行的分布式 Web 应用程序。问题是所有节点都需要在内存中保留相同的数据(因此增加节点数量无助于内存压力)。因此,只有在水平(添加
我正在寻找有关为 ECS 任务分配内存的指南。我正在为希望在服务器成本上尽可能便宜的客户运行 Rails 应用程序。我正在查看具有 2 个 CPU 和 4 GB 内存的中等服务器大小。 大多数情况下,
我是 ECS 新手,我正在尝试使用 Cloudformation 部署它。 我通过查看文档以及从博客和一些文章中找到的一些示例来制作以下 cloudformation 模板。 但是,由于某种原因,它在
也许这很愚蠢,但如果我创建一个 ECS 任务定义(例如参见 https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aw
ECS 的容器定义允许您指定 memoryReservation对于每个容器: The soft limit (in MiB) of memory to reserve for the contain
我在 ca-central 区域创建了一个 AWS ECS 实例。它与每次更新服务时都会更改的动态公共(public) ip 一起使用。到目前为止一切都很好。 由于需要一个公网静态IP,所以我在同一区
Invalid 'containerPort' setting for container 'prerenderContainer'.(Service: AmazonECS; Status Code:
如果我在 ECS 服务级别进行自动扩展,我看不到使用容量提供程序扩展 ECS 集群的意义: https://docs.aws.amazon.com/AmazonECS/latest/developer
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改进这个问题?更新问题,使其成为 Stack Overflow 的 on-topic。 1年前关闭。
我是一名优秀的程序员,十分优秀!