当前位置:主页 > 云数据库 > 正文

好用的云存储__web建站软件

时间:2021-04-09 03:25 来源:埃里克云 编辑:埃里克云

核心提示

在加入后不久,我被要求帮助一些同事解决一个问题,这个问题阻碍了在客户站点上的概念验证部署。客户无法将数据从他们的一个数据库导入到Delphix中,每次尝试都会失败,并出现...

好用的云存储__web建站软件

在加入后不久,我被要求帮助一些同事解决一个问题,这个问题阻碍了在客户站点上的概念验证部署。客户无法将数据从他们的一个数据库导入到Delphix中,每次尝试都会失败,并出现异常"Failed to parse chunk header"。虽然我们在多个客户站点看到了这种情况,但我们无法在本地重现此问题。乍一看,事情似乎相对简单。从问题发生时起,团队已经有了完整的回溯跟踪和数据包跟踪的日志,要找出哪里出了问题有多难?鉴于我们所掌握的数据,我们决定先看看异常是从哪里来的。结果这个异常是从Grizzly内部抛出的,Grizzly是一个开源的javahttp服务器实现。我们开始查看灰蒙蒙的源代码,试图理解到底发生了什么,但是没有什么明显的东西跳出来,这是一个很大的代码体。被调用以读取头数据的接口可以是7种不同实现之一。不幸的是,当时我们没有构建Grizzly源代码,只是在构建中包含了jar文件,因此使用调试器遍历堆栈并不是一个简单的选择。谢天谢地,我们有了DTrace;通过Java对DTrace的支持(未来一篇博客文章的主题),我们能够编写一些探测,为从麻烦的调用中调用的每个方法捕获Java堆栈跟踪。这让我们对灰熊的所作所为有了更清晰的了解,并引导我们得出以下代码:tmpKey=通道寄存器(读选择器,SelectionKey.OP_读取);tmpKey.interestOps(tmpKey.interestOps() | SelectionKey.OP_读取);整数代码=读选择器.select(读超时);tmpKey.interestOps(tmpKey.interestOps()&(~SelectionKey.OP_读取));如果(代码==0){return r;<;--***我们认为我们正在处理这个案子} 调用select returning而不准备事件解释了我们看到的行为,但是为什么select返回?超时过期了吗?线被打断了吗?我们收到信号了吗?我们是不是真的醒了?我们是不是因为一些无关的事情被叫醒了?我们有很多理论,但没有具体的东西,所以我们决定更详细地研究包跟踪,看看是否可以排除任何可能性。包跟踪清楚地显示客户端向我们发送数据,延迟约30秒,连接关闭,相关异常。这似乎指向超时过期,但配置的超时远大于30秒。虽然我们已经缩小了问题可能来自哪里,但我们仍然无法在内部复制它。然而,这是第一次,我们有一个客户一直在坚持,这给了我们一个获得更多数据的机会。我们决定最好的方法是创建工具来测试我们拥有的每一个理论,然后从客户的系统中收集数据。DTrace是添加这种检测的自然方式,但不幸的是,DTrace对Java方法入口/方法返回探测的支持非常昂贵。启用对这些探测的支持会导致JVM的CPU利用率大幅上升,在客户系统上启用它们不是一个选择。为了解决这个问题,我们决定看看读选择器.select实现的目的是查看我们是否可以检测系统调用以捕获选择/唤醒。读选择器.select通过java.nio.channels频道.Selector类。通过对JDK实现的跟踪,我们最终得到了DevPollArrayWrapper的poll0的本机c实现。更具体地说,我们发现了idevpoll函数(如果你能在这里发现不相关的计时错误,那就加分): gettimeofday(&t,NULL);开始=t.tv_秒*1000+t.tv_usec/1000;对于(;;){/*poll(7d)ioctl不返回剩余计数*/int res=ioctl(wfd、dpctl和a);if(res<;0&errno==EINTR){if(remaining>;=0){gettimeofday(&t,NULL);现在=t.tv_秒*1000+t.tv_usec/1000;diff=现在-开始;剩余-=diff;如果(差异<;0 | |剩余<;=0){返回0;}开始=现在;}}其他{返回res;}} 看起来不多,但这确实限制了我们搜索的范围。虽然/dev/poll的实现有点复杂(man poll.7d),但是如果我们能够追踪到DP_poll ioctl的调用会被唤醒的所有原因,我们就会得到答案。为此编写D代码有点复杂,为了限制噪声,我们需要限制探测器只在我们关心的情况下发射。对DP_POLL的调用不包括调用方正在轮询的文件描述符,这些描述符是通过以前的write调用设置的。我们知道Grizzly可能会从中读取数据,但我们需要一种方法来遍历文件描述符的哈希表,看看它们是否存在。这并不简单,因为DTrace不允许迭代,因此我们得出了以下结论: #!/usr/sbin/dtrace-Cs公司#包括<;sys/devpoll.h>;#pragma D option jstackstrsize=4k#pragma D option nspec=30fbt::dpioctl:条目{此匹配=0;此->找到=0;此->p0=(struct polldat*)NULL;}fbt::dpioctl:条目/pid==$1&arg1==DP峎轮询/{/**检查DP_POLL ioctl是否正在*调用具有给定fd($2)的缓存fd集*有事件发生!=0。*/此->次=arg0&0x3ffff;this->;dpep=`devpolltbl[此->次要];this->;pcp=this->;dpep->;dpe_pcache;this->;p0=this->;pcp->;pcu hash[$2%this->;pcp->;pc\u hashsize];}/**使用下一个宏生成一组谓词和探测*在pcache哈希链中遍历一个条目。重复下一步*我们想走多少层就走多少层。*/#定义下一步(P)fbt::dpioctl:条目/!此->;匹配>;此->;P!=空&;this->;P->;pd\u fd==2美元/{此->匹配=1;}fbt::dpioctl:条目/!此->;匹配>;此->;P!=空/{this->;P=此->;P->;pd\u next;}下一步(p0)下一步(p0)下一步(p0)下一步(p0)fbt::dpioctl:条目/此->匹配>;此->;p0->;pd\U事件!=0/{此->找到=1;} 被轮询的文件描述符保存在按设备的次编号编制索引的每设备项(dp_entry_t)的哈希表(pollcache_t)中。为了检查我们关心的文件描述符是否存在,我们实现了脚本中pcache_lookup_fd中存在的相同逻辑。由于我们无法迭代哈希表,所以我们使用宏来生成谓词,以允许我们处理有限数量的冲突。这个D代码允许我们将收集数据限制在我们知道来自Grizzly的调用。鉴于此,我们添加了逻辑以推测性地跟踪所有唤醒,并添加了逻辑,以便在遇到任何我们认为可能导致问题的错误条件时转储推测性数据。剧本的其余部分看起来像:/**用于转储输入和返回fd信息的便利宏*始终如一。**注意:这些依赖于self/this context被正确设置,*所以在使用它们的地方要小心。*/#定义打印条目(标签)此->时间间隔=(时间戳-自身->ts)/1000000;"超时,事件数=%fd,事件数=%d",tid,LABEL,$2,self->;事件,self->;nfds,self->;timeout,这一点->过去);#define PRINT_RETURN_FD(标签)此->时间间隔=(时间戳-自身->ts)/1000000;printf("Tid:%d%s(fd=%d,事件=%d,事件=%d,事件=%d,elapseMS=%d)",tid、LABEL、此->;fds.fd公司,此->;fds.事件,此->;财务报表,此->过去);#定义转储数据()jstack();自我->失败=1;fbt::dpioctl:条目/此->;找到/{自我->是=1;self->events=此->p0->pd\u events;自身时间戳=ts;gt;/**此ioctl的参数是dvpoll32结构:**typedef结构dvpoll32{*caddr32;轮询阵列*uint32_t dp_nfds;dp_fds中pollfd的数目[]*int32_t dp_超时;超时(毫秒)*}dvpoll32;**dp_fds是指向数组的指针:**typedef结构pollfd{*内;fd*短事件;事件中*短报;出局事件*}轮询**此函数返回:*>0:*这表示错误,返回的是errno值*0:*成功。$arg5是指向fd的计数的指针*返回时,dvpoll->;dp_fds将密集包装*产生的fd和相关事件*为(事件)和*现在准备好了(启示录)。*/此->;dvpoll32=(dvpoll32_t*)copyin(arg2,sizeof(dvpoll32_t));/**保存一个指向pollfd\u t数组的指针,数组的大小,然后*超时以便我们可以在返回探测器中检查它们。*/self->fds=此->dvpoll32->;dp\fds;self->;nfds=此->dvpoll32->;dp\nfds;self->timeout=此->dvpoll32->;dp\u timeout;self->;rvalp=args[5];}fbt::dpioctl:条目/自我->是/{self->规范=推测();}/**记录感兴趣的线程何时进入睡眠状态。*/计划::睡眠/自我->是/{感兴趣的[pid,tid]=自我规范;}计划::唤醒/内景

  • 企业云_哪里买_大数据网站 企业云_哪里买_大数据网站

    Delphix最近与AWS合作,帮助人们和团队加快并确保迁移到业界领先的Amazon Web服务云平台。AWS市场上的Delphix结合了AWS,加快了重要的迁移项目,并将时间从几周、几个月缩短到几天。客...

  • 云存储服务器_网站_云存储文件上传 云存储服务器_网站_云存储文件上传

    数据操作帮助人们与数据连接的方式因技术、用户和用例的不同而有很大差异。例如,数据民主化一直是分析界的话题,专注于为非技术用户提供回答关键问题和推动业务新见解所需...

  • 带宽和网速的关系_如何租用_工业大数据 带宽和网速的关系_如何租用_工业大数据

    在大多数人可能会做噩梦,梦到上班时忘了穿裤子,数据库管理员(DBA)的噩梦围绕着出现在工作中,被告知生产系统出现严重故障或其他高影响情况,而完全不知道。监控和警觉是...

  • 阿里服务器_如何选_物联网开发套件 阿里服务器_如何选_物联网开发套件

    几天前,在旧金山的纳斯达克中心,我见到了首席信息官Ken Piddington先生,他也是首席信息官的执行顾问。Ken说:"我和首席信息官和IT部门的首要任务是数据转换。"事实上,他经常听...

  • 阿里服务器_阿里云_国内物联网操作系统 阿里服务器_阿里云_国内物联网操作系统

    "对创新的需求正在增长,而且增长迅速,"埃森哲的吉滕德拉·卡瓦特卡尔(Jitendra Kavathekar)最近在旧金山举行的Delphix数据活动上评论道我们需要将人们与技术联系起来,推动全球的...

  • <strong>香港cn2服务器_什么是_大数据分析软件有</strong> 香港cn2服务器_什么是_大数据分析软件有

    数据的使用应该是无摩擦的,让数据消费者能够看到和访问所有版本的授权数据,而不必考虑位置、云平台或存储供应商。为了确保这些能力,企业实施解决方案,在管理数据的运营...

  • 数据云_怎么购买_云服务器哪便宜 数据云_怎么购买_云服务器哪便宜

    上周,我们的一个主要合作伙伴给我发了一封信,帮助他了解在Oracle和SQL Server上实现Delphix的方式之间的差异。如果您不熟悉Delphix动态数据平台(DDP),那么在您阅读完Oracle的支持和...

  • 负载均衡_如何租用_人工智能用的什么技 负载均衡_如何租用_人工智能用的什么技

    德尔菲斯工程和支持是非常了不起的人。他们继续寻求解决方案,不管需要多少时间,也不管他们面临支持异构环境、硬件配置和客户需求的复杂挑战。这篇文章是为了支持我们的团...

  • 大宽带服务器_海外_关系型数据库和非关 大宽带服务器_海外_关系型数据库和非关

    大家好!我又回到了"演示马鞍"上,来展示将数据从一个云复制到另一个云是多么容易。数据摩擦比比皆是,很少有地方像云迁移项目那样感受到数据摩擦。将数据传输到云中可能是一...