`
gaojingsong
  • 浏览: 1182048 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Zookeeper3.4.6之源码解读(二)

阅读更多

一、问题描述:

最近使用storm之后发现zookeeper总是出现警告,故此跟踪了一下源码,知道问题产生在哪里。警告信息如下:

2014-09-19 13:41:29,400 [myid:1] - WARN  [SyncThread:1:FileTxnLog@321] - fsync-ing the write ahead log in SyncThread:1 took 4575ms which will adversely effect operation latency. See the ZooKeeper troubleshooting guide

2014-09-19 13:41:30,453 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:Follower@89] - Exception when following the leader

java.net.SocketTimeoutException: Read timed out

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)

at java.io.BufferedInputStream.read(BufferedInputStream.java:237)

at java.io.DataInputStream.readInt(DataInputStream.java:370)

at org.apache.jute.BinaryInputArchive.readInt(BinaryInputArchive.java:63)

 

二、问题定位:(FileTxnLog)

org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.class



 

 

 /**

     * commit the logs. make sure that evertyhing hits the

     * disk

     */

    public synchronized void commit() throws IOException {

        if (logStream != null) {

            logStream.flush();

        }

        for (FileOutputStream log : streamsToFlush) {

            log.flush();

            if (forceSync) {

                long startSyncNS = System.nanoTime();

                //执行这个任务时间如果超过fsyncWarningThresholdMS就告警

                log.getChannel().force(false);

 

                long syncElapsedMS =

                    TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startSyncNS);

                if (syncElapsedMS > fsyncWarningThresholdMS) {

                    LOG.warn("fsync-ing the write ahead log in "

                            + Thread.currentThread().getName()

                            + " took " + syncElapsedMS

                            + "ms which will adversely effect operation latency. "

                            + "See the ZooKeeper troubleshooting guide");

                }

            }

        }

        while (streamsToFlush.size() > 1) {

            streamsToFlush.removeFirst().close();

        }

    }

 

 

三、分析解决方案:

1)fsyncWarningThresholdMS默认值是多少

 

/** Maximum time we allow for elapsed fsync before WARNing */

    private final static long fsyncWarningThresholdMS;

 

    static {

        LOG = LoggerFactory.getLogger(FileTxnLog.class);

 

        String size = System.getProperty("zookeeper.preAllocSize");

        if (size != null) {

            try {

                preAllocSize = Long.parseLong(size) * 1024;

            } catch (NumberFormatException e) {

                LOG.warn(size + " is not a valid value for preAllocSize");

            }

        }

         //如果获取不到默认值就是1000

        fsyncWarningThresholdMS = Long.getLong("fsync.warningthresholdms", 1000);

    }

 

 

 public static Long getLong(String nm, long val) {

        Long result = Long.getLong(nm, null);

        return (result == null) ? Long.valueOf(val) : result;

    }

 

  public static Long getLong(String nm, Long val) {

        String v = null;

        try {

            v = System.getProperty(nm);

        } catch (IllegalArgumentException e) {

        } catch (NullPointerException e) {

        }

        if (v != null) {

            try {

                return Long.decode(v);

            } catch (NumberFormatException e) {

            }

        }

        return val;

    }

 

 

此处参考源码阅读一的这个方法:也没有发现给fsyncWarningThresholdMS 赋值的情况

 /**

     * Parse config from a Properties.

     * @param zkProp Properties to parse from.

     * @throws IOException

     * @throws ConfigException

     */

    public void parseProperties(Properties zkProp)

    throws IOException, ConfigException {

        int clientPort = 0;

        String clientPortAddress = null;

        for (Entry<Object, Object> entry : zkProp.entrySet()) {

            String key = entry.getKey().toString().trim();

            String value = entry.getValue().toString().trim();

           

           if (key.startsWith("group")) {

                int dot = key.indexOf('.');

                long gid = Long.parseLong(key.substring(dot + 1));

 

                numGroups++;

 

                String parts[] = value.split(":");

                for(String s : parts){

                    long sid = Long.parseLong(s);

                    if(serverGroup.containsKey(sid))

                        throw new ConfigException("Server " + sid + "is in multiple groups");

                    else

                        serverGroup.put(sid, gid);

                }

 

            } else if(key.startsWith("weight")) {

                int dot = key.indexOf('.');

                long sid = Long.parseLong(key.substring(dot + 1));

                serverWeight.put(sid, Long.parseLong(value));

            } else {

                System.setProperty("zookeeper." + key, value);

            }

        }  

    }

 

fsync.warningthresholdms(java:fsync.warningthresholdms)

当日志中的fsync函数超出了该值的长度,就会在日志出输出警告信息。默认值是1000(毫秒级),是系统属性。

 

 

解决方案:

在zoo.cfg中配置不生效。在conf/java.env中添加java系统属性:、

 

export JVMFLAGS="-Dfsync.warningthresholdms=20 $JVMFLAGS"

  • 大小: 88.8 KB
0
8
分享到:
评论

相关推荐

    zookeeper3.4.6超稳定版

    二、Zookeeper 3.4.6版本特性 1. **稳定性增强**:3.4.6版本修复了大量已知问题,提升了系统的整体稳定性,使得在大规模分布式环境下的运行更加可靠。 2. **性能优化**:对Zookeeper的内部数据结构和算法进行了...

    zookeeper3.4.6 我的(lh2420124680)下载

    二、Zookeeper 3.4.6 版本亮点 Zookeeper 3.4.6 是一个稳定且广泛使用的版本,包含了多个修复和改进。这个版本提高了性能,增强了稳定性,并解决了之前版本中的一些已知问题。对于分布式系统开发者来说,选择这个...

    zookeeper-3.4.6.zip

    《Apache ZooKeeper 3.4.6:分布式协调服务详解》 Apache ZooKeeper 是一个开源的分布式协调服务,它为分布式应用提供了一个高效且可靠的命名服务、配置管理、集群同步和分布式锁等基础功能。在Zookeeper 3.4.6版本...

    zookeeper-3.4.6.tar

    1. **源代码**:提供了完整的Zookeeper服务器端和客户端的源代码,开发者可以通过阅读源码了解其内部工作原理,或者进行定制化开发。 2. **文档**:包括用户指南、管理员手册和开发者指南,帮助用户快速上手,理解...

    zookeeper-3.4.6

    zookeeper-3.4.6下载 zookeeper-3.4.6下载zookeeper-3.4.6下载zookeeper-3.4.6下载zookeeper-3.4.6下载zookeeper-3.4.6下载zookeeper-3.4.6下载zookeeper-3.4.6下载

    zookeeper3.4.6安装包

    在了解Zookeeper3.4.6的安装过程之前,我们首先需要理解Zookeeper的基本概念和架构。Zookeeper采用的是基于Paxos算法的ZAB协议,保证了数据的一致性和可靠性。它的架构是由一个或多个Server节点组成的集群,每个...

    zookeeper3.4.6 windows 版本

    总的来说,ZooKeeper 3.4.6在Windows上的使用为开发者提供了便捷的本地环境,便于学习、测试和调试分布式系统,尤其是对于使用Dubbo构建的应用,它扮演了关键的角色,帮助实现服务治理和分布式一致性。了解并熟练...

    ZooKeeper3.4.6-注册中心安装步骤及安装包

    首先,你需要从Apache官方网站获取ZooKeeper 3.4.6的安装包,文件名为`zookeeper-3.4.6.tar.gz`。下载完成后,将其解压到你的服务器或本地机器的合适目录,例如 `/usr/local`: ```bash wget ...

    zookeeper-3.4.6 eclipse

    1. 下载Zookeeper 3.4.6源码:从Apache官方网站下载Zookeeper 3.4.6的源代码压缩包,解压到本地目录。 2. 创建Eclipse项目:在Eclipse中,选择File &gt; New &gt; Java Project,输入项目名(例如“Zookeeper_3.4.6”),...

    zookeeper3.4.6和jdk1.7(linux)

    以下是关于"zookeeper3.4.6和jdk1.7(linux)"的详细知识点: 1. **Zookeeper**: - **定义**:Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态,并根据...

    zookeeper-3.4.6.jar

    zookeeper-3.4.6.jar

    zookeeper-3.4.6.rar

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...

    zookeeper 3.4.6版本

    二、Zookeeper 3.4.6版本的特点 1. 性能优化:3.4.6版本在处理大量并发请求和网络通信方面进行了优化,提高了系统的吞吐量和响应速度。 2. 高可用性:通过多副本机制,Zookeeper可以实现数据的高可用性和一致性。在...

    zookeeper-3.4.6_zookeeper_

    在标题“zookeeper-3.4.6_zookeeper_”中,我们可以看到这是关于Zookeeper的一个特定版本——3.4.6的讨论。这个版本的发布对于理解和使用Zookeeper至关重要,因为它包含了该框架的稳定性和功能增强。 在描述“注册...

    zookeeper-3.4.6 2.zip

    二、Zookeeper 3.4.6特性 1. 性能优化:3.4.6版本对性能进行了优化,包括提升客户端的连接速度、降低内存消耗以及减少网络延迟,使得大规模部署下的Zookeeper运行更加稳定和高效。 2. 强化稳定性:修复了多个已知的...

    tomcat;dubbo;zookeeper3.4.6.rar

    zookeeper3.4.6.rar"所涵盖的是一个整合了三个关键组件的压缩包:Tomcat服务器、Dubbo服务治理框架以及ZooKeeper分布式协调服务。这个组合在企业级Java应用开发中非常常见,主要用于构建高效、可扩展的微服务架构。 ...

    zookeeper-windows-3.4.6

    《Zookeeper Windows 3.4.6:Dubbo开发的核心组件》 Zookeeper,作为Apache的一个顶级项目,是分布式应用程序协调服务的基石,它提供了一种简单有效的原语集,使得分布式系统的各种复杂问题得以简化。在Windows环境...

    zookeeper-3.4.6.tar.gz

    二、Zookeeper主要功能 1. **命名服务**:通过创建唯一的全局命名空间,可以为分布式应用的组件分配唯一的ID。 2. **配置管理**:集中存储和更新配置,确保所有节点共享同一配置,提高系统一致性。 3. **集群管理...

Global site tag (gtag.js) - Google Analytics