我正在启用持久性的Kubernetes集群中运行Ignite。每台机器都有一个24 GB的Java堆,其中20 GB专门用于持久内存,内存限制为110 GB。我相关的JVM选项是-XX:+AlwaysPreTouch -XX:+UseG1GC -XX:+ScavengeBeforeFullGC。在每个节点上运行DataStreamers几个小时后,群集中的节点达到k8s内存限制,触发了OOM终止。运行Java NMT后,我惊讶地发现分配给内部存储器的大量空间。
Java Heap (reserved=25165824KB, committed=25165824KB)
(mmap: reserved=25165824KB, committed=25165824KB)
Internal (reserved=42425986KB, committed=42425986KB)
(malloc=42425954KB #614365)
(mmap: reserved=32KB, committed=32KB)
Run Code Online (Sandbox Code Playgroud)
Kubernetes指标证实了这一点:
“点燃缓存”是内核页面缓存。最后一个面板“堆+持久+缓冲区”是点火指标HeapMemoryUsed+ PhysicalMemorySize+ 的总和CheckpointBufferSize。
我知道这不是数据积累的结果,因为DataStreamer在读取每个文件后都会刷新(最大约250MB),并且没有节点一次读取4个以上的文件。在排除了其他问题之后,我尝试设置-XX:MaxDirectMemorySize=10G并调用了手动GC,但是除了定期关闭所有pod并重新启动它们之外,似乎没有任何影响。
我不确定从这里去哪里。Ignite中是否有一种解决方法不强迫我使用第三方数据库?
编辑:我的DataStorageConfiguration
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="metricsEnabled" value="true"/>
<property name="checkpointFrequency" value="300000"/>
<property name="storagePath" value="/var/lib/ignite/data/db"/>
<property name="walFlushFrequency" value="10000"/>
<property name="walMode" value="LOG_ONLY"/>
<property name="walPath" value="/var/lib/ignite/data/wal"/>
<property name="walArchivePath" value="/var/lib/ignite/data/wal/archive"/>
<property name="walSegmentSize" value="2147483647"/>
<property name="maxWalArchiveSize" value="4294967294"/>
<property name="walCompactionEnabled" value="false"/>
<property name="writeThrottlingEnabled" value="False"/>
<property name="pageSize" value="4096"/>
<property name="defaultDataRegionConfiguration"> …Run Code Online (Sandbox Code Playgroud) Kafka Streams内置了哪些功能,允许将单个输入流动态连接到多个输出流?KStream.branch允许基于真/假谓词的分支,但这不是我想要的.我希望每个传入日志确定它将在运行时{"date": "2017-01-01"}流式传输到的主题,例如,日志将流式传输到主题topic-2017-01-01,日志{"date": "2017-01-02"}将流式传输到主题topic-2017-01-02.
我可以调用forEach流,然后写一个Kafka制作人,但这似乎并不优雅.在Streams框架中有更好的方法吗?
我有一个Kubernetes服务(一个Python Flask应用程序)使用LoadBalancer类型在端口30000上公开公开(所有Kubernetes NodePorts必须在我理解的范围内,在30000-32767范围内).我需要在标准的HTTP端口80上访问面向公众的服务.这样做的最佳方法是什么?
我刚开始使用Apache Kafka/Zookeeper,并且在尝试在AWS上设置集群时遇到了问题.目前我有三台服务器:
一个正在运行的Zookeeper和两个运行Kafka.
我可以毫无问题地启动Kafka服务器,并可以在这两个服务器上创建主题.但是,当我尝试在一台机器上启动一个生产者而在另一台机器上启动一个消费者时遇到了麻烦:
在卡夫卡制片人:
kafka-console-producer.sh --broker-list <kafka server 1 aws public dns>:9092,<kafka server 2 aws public dns>:9092 --topic samsa
Run Code Online (Sandbox Code Playgroud)
关于卡夫卡消费者:
kafka-console-consumer.sh --zookeeper <zookeeper server ip>:2181 --topic samsa
Run Code Online (Sandbox Code Playgroud)
我在制作人("hi")上输入一条消息,暂时没有任何反应.然后我收到这条消息:
ERROR Error when sending message to topic samsa with key: null, value: 2 bytes
with error: Failed to update metadata after 60000 ms.
(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
Run Code Online (Sandbox Code Playgroud)
在消费者方面,我收到此消息,该消息会定期重复:
WARN Fetching topic metadata with correlation id # for topics [Set(samsa)] from broker [BrokerEndPoint(<broker.id>,<producer's advertised.host.name>,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
at kafka.producer.SyncProducer.send(SyncProducer.scala:119) …Run Code Online (Sandbox Code Playgroud) 我在我的代码中遇到了一些好奇的东西,并且想知道这个行为是否有直接的解释.鉴于以下声明:
if let tabBarController = topViewController as? UITabBarController {
for subcontroller in tabBarController.viewControllers! {
println(subcontroller.view)
if let subcontrollerView = subcontroller.view {
println(subcontrollerView)
println(subcontrollerView!)
if subcontrollerView!.window != nil && subcontroller.isViewLoaded() {
topViewController = subcontroller as? UIViewController
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,if-let语句应该为我解开条件 - 但这不是这里展示的行为.除非我再次打开可选项window,subcontrollerView否则我无法访问该属性.x-code控制台返回以下内容:
Optional(<UILayoutContainerView: 0x7fbccd44e7f0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fbccacdde90>; layer = <CALayer: 0x7fbccd440e30>>)
Optional(<UILayoutContainerView: 0x7fbccd44e7f0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: …Run Code Online (Sandbox Code Playgroud) 我已经在Kubernetes上运行Kafka了一段时间没有任何重大问题; 然而,我最近推出了一组Cassandra pods并开始遇到Kafka的性能问题.
尽管Cassandra不像Kafka那样使用页面缓存,但它确实会频繁写入磁盘,这可能会影响内核的底层缓存.
我知道Kubernetes pod正在通过cgroup管理内存资源,可以通过在Kubernetes中设置内存请求和限制来配置,但我注意到Cassandra利用页面缓存可以增加我的Kafka pod中的页面错误数量,即使它们是似乎没有竞争资源(即,他们的节点上有可用的内存).
在Kafka中,更多页面错误会导致更多磁盘写入,这会妨碍顺序IO的优势并降低磁盘性能.如果您使用AWS的EBS卷,这将最终耗尽您的突发平衡并最终导致整个群集的灾难性故障.
我的问题是,是否有可能隔离Kubernetes中的页面缓存资源,或者以某种方式让内核知道我的Kafka pod所拥有的页面应该比我的Cassandra pod中的那些更长时间保存在缓存中?
我很困惑为什么php的instanceof运算符坚持认为这里的LVALUE不是定义类的实例get_class.
class WhereIn {
public function __construct($args) {
echo "is instanceof: " . ($args[0] instanceof ActiveRecordField) . EOL;
echo "get class: " . get_class($args[0]) . EOL;
}
}
Run Code Online (Sandbox Code Playgroud)
此方法的输出是:
is instanceof:
get class: ActiveRecordField
Run Code Online (Sandbox Code Playgroud)
作为参考,我使用的是PHP 5.6.9.
给定一个多态类层次结构:
class A(Base):
__tablename__ = 'a'
a_id = Column('id', Integer, primary_key=True)
type = Column(String(255), nullable=False)
__mapper_args__ = {
'polymorphic_identity': 'a',
'polymorphic_on': type
}
class B(A):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey(A.a_id))
__mapper_args__ = {
'polymorphic_identity': 'b',
}
Run Code Online (Sandbox Code Playgroud)
我不想B被强迫加入反对A,如果我只检索从属性B,如:session.query(B.id).all()。此外,我注意到给定的第三个类型表A与 有关系B:
class C(A):
__tablename__ = 'c'
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey(A.a_id))
b_id = Column(Integer, ForeignKey(B.id))
b = relationship(B, foreign_keys=[b_id])
__mapper_args__ = { …Run Code Online (Sandbox Code Playgroud) 我有一个 init 容器,我在其中存储文件,但在运行时它显示文件不存在。有什么方法可以在 init 容器中执行并检查文件的存储位置。
我正在尝试为Kubernetes附加可虚拟连接的FlexVolume示例,该示例似乎根据我在节点和主节点上的日志正常初始化:
Loaded volume plugin "flexvolume-k8s/dummy-attachable
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将卷附加到Pod上时,主方法永远不会调用attach方法。来自节点的日志显示为:
flexVolume driver k8s/dummy-attachable: using default GetVolumeName for volume dummy-attachable
operationExecutor.VerifyControllerAttachedVolume started for volume "dummy-attachable"
Operation for "\"flexvolume-k8s/dummy-attachable/dummy-attachable\"" failed. No retries permitted until 2019-04-22 13:42:51.21390334 +0000 UTC m=+4814.674525788 (durationBeforeRetry 500ms). Error: "Volume has not been added to the list of VolumesInUse in the node's volume status for volume \"dummy-attachable\" (UniqueName: \"flexvolume-k8s/dummy-attachable/dummy-attachable\") pod \"nginx-dummy-attachable\"
Run Code Online (Sandbox Code Playgroud)
这是我尝试挂载卷的方式:
apiVersion: v1
kind: Pod
metadata:
name: nginx-dummy-attachable
namespace: default
spec:
containers:
- name: …Run Code Online (Sandbox Code Playgroud) kubernetes ×5
apache-kafka ×3
java ×3
python ×2
cgroups ×1
containers ×1
docker ×1
flask ×1
http ×1
ignite ×1
instanceof ×1
ios ×1
kops ×1
memory-leaks ×1
networking ×1
optional ×1
page-caching ×1
php ×1
sqlalchemy ×1
swift ×1
types ×1