云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

微软云_并购数据库_最新活动

小七 141 0

私有云存储_关于_中国人工智能公司排名

在Delphix的第一周,我被要求参加一个客户的支持电话。该客户最近已将其4 vCPU Delphix VM(运行在VMware ESX上)升级到新的Delphix版本,并添加了两个额外的vCPU。升级后,虚拟机将不再启动。每次VM启动时,操作系统都会开始初始化,然后挂起。我和我的同事试图强制执行崩溃转储,返利机器人是真的吗,但不幸的是,VM没有响应NMI。我们重新启动了虚拟机,并使用调试器完成了早期引导,这表明系统在调用start_other_cpu()后挂起了某个时间。start_other_cpus()是在早期引导期间从CPU 0调用以启动系统中的其他处理器的,从调试器中不清楚它挂起的位置或原因。客户急于要回他们的系统,所以我们冒了一个险,把vCPU的数量从6改为1。令我们惊讶的是,虚拟机启动了。然后我们将vCPU计数从1改回6,虚拟机仍然启动。客户对系统正常运行很高兴,但我更担心,因为我们不知道真正的根本原因。在客户暂时解除封锁的情况下,我回到了德尔菲克斯,试图在内部重现这个问题。我写了一个简单的脚本,与在客户网站上所做的相匹配:1) 启动4 vCPU虚拟机2) 升级Delphix OS版本3) 停止虚拟机4) 将vCPU计数从4更改为65) 启动虚拟机花了大约一个星期的时间,但我终于重现了这个问题。虽然我在客户系统上受时间限制,但我现在可以一条指令一条指令地完成引导过程。可悲的是,与kmdb的单步操作会导致系统在启动时不再挂起。我想使用DTrace来收集一些堆栈回溯,但是不能利用事后分析工具,购买云服务器,因为在引导期间挂起太早了。DTrace使我非常习惯于记录理解和诊断问题所需的任意数据。当DTrace无法发光的领域出现问题时,它会使缺乏信息更加痛苦。幸运的是,我的老同事keithadams在VMware中构建了一个类似DTrace的工具,可以观察到客户操作系统正在做什么。esx4.1没有VProbes,所以我把VM迁移到了esx5.0上,如果工作有一段时间后,问题又出现了。我的第一个实验是编写一个简单的VProbe脚本,在1Hz定时器上获取一个回溯轨迹,看看各种vCPU在哪里。我想到了以下几点:@VM=147(定义字符串堆栈)(V探头VMM1Hz(客栈)(printf"CPUD:%d堆栈:%sn"VCPUID堆栈)这产生了以下结果:CPUD:1栈:GUEST xfffffffffb8545c6_0xfffffffffb854a79CPUD:3栈:GUEST xfffffffb841c8e_0xfffffffffb842595_0xfffffffb84278e_0xfffffffffb84357e_0x0CPUD:0堆栈:GUEST xfffffffb84cd24_0xfffffffb841e1c_0xfffffffb841f5c_0xfffffffffb842220_0xfffffffba724f4_0xfffffffffb8000a0_0x0CPUD:2栈:GUEST xfffffffb801d94_0xfffffffb9ec9ed_0xfffffffb9ed69d_0xfffffffffb9d4b3f_0xfffffffb9d54db_0xfffffffb9dc2a3_0xfffffffb9dc172_0xfffffffb79d376d_0xfffffffffb86e938_0x0这太棒了!在VProbes之前,我不知道CPU挂在哪里,现在我有了所有CPU的位置!查看数据一段时间后,我注意到CPU 1、2和3的回溯总是相同的,CPU 3的回溯在同一函数中的两个不同偏移之间变化。使用旧ESX主机上运行的另一个VM副本,我编写了一个脚本,使用mdb将VProbes中的十六进制地址转换为符号堆栈:CPU 0:tsc同步主机+0x6c:mp启动cpu公共+0x134:启动cpu+0x44:启动其它CPU+0x198:主+0x2ac:_locore_启动+0x90:CPU 1:xc服务+0x12e:xc_公共电话+0x229:CPU 2:cbe\u xcall+0x95:此处循环重编程+0x4d:循环重编程+0x95:callout_heap_insert+0x6f:超时\u generic+0x333:简历时间等待招聘+0xab:cv_timedwait+0x5a:arc_reclaim_线程+0x13d:线程开始+8:CPU 3:mp_启动_信号+0x6e:mp_启动_common+0x1b5:启动启动启动启动+0xe:0xfffffffffb84357e: CPU 0和3的回溯似乎卡在了紧密的循环中:CPU 0卡在tsc_sync_master()中:...for(cnt=0;cnt<;SYNC_ITERATIONS;cnt++){同时(tsc同步走!=TSC_SYNC_GO)SMT_PAUSE();<;--***卡在这里***...CPU 3在从mp_startup_common()调用mp_startup_signal()时卡住:...CPUSET_ATOMIC_ADD(*(CPUSET_t*)sp,cpuid);for(tempset=*sp;CPU_IN_SET(tempset,cpuid);温度设置=*(易失性cpuset_t*)sp){SMT_PAUSE();<;--***卡在这里***}...在高级别上,CPU 0正在等待CPU 3指示它已准备好同步其TSC。CPU 3已经完成了TSC的同步,正在等待引导CPU向它发出信号以完成初始化。仔细看一下tsc_sync_master(),我发现了一个明显的问题:...hwtype=get_hwenv();如果(!tsc_master_slave_sync_needed | | hwtype==HW_XEN_HVM||hwtype==HW_VMWARE)cpu_id;for(cnt=0;cnt<;SYNC_ITERATIONS;cnt++){同时(tsc同步走!=TSC_SYNC_GO)SMT_PAUSE();<;--***卡在这里***...tsc\u sync_master()具有显式逻辑,如果我们运行在VMware上,则不同步tsc,但不知何故get_hwenv()返回了HW_VMware之外的其他内容。看了看get_hwenv(),物联网应用技术是什么,我很快就确定了platform():...内景获取hwenv(无效){if(平台类型==-1)确定_平台();返回(平台式);}静孔隙确定平台(){结构cpuid_regs cp;char*xen\u str;字符;uint32_t xen_签名[4],基;平台类型=硬件本地;...}如果多个CPU调用determine_platform(),那么determine_platform()显然会被破坏,因为每次调用它时,淘客购物,它都会重置全局platform_类型。结果是,我们从cpuid_pass1()调用determine_platform(),它作为每个cpu的mp_cpu_start_common()的一部分被调用。喂,我找到比赛了!CPU 3调用determinate_platform(),作为启动的一部分,在将platform_type设置为HW_NATIVE之前,将其短暂设置为HW_VMWARE。在该窗口期间,CPU 0碰巧调用了get_hwenv(),这会导致tsc_sync_master()在等待CPU 3将tsc_sync_go设置为tsc_sync_go时卡住,这将永远不会发生。我总是惊讶于一旦你有了正确的数据,诊断复杂问题是多么容易。我试图用mdb调试这个问题好几天,人工智能是,但没有取得任何进展,但是在获得VProbe数据的几个小时内,我就找到了根本原因。虽然DTrace几乎可以从任何地方收集数据,但系统的某些部分却无法访问。VProbes是一个巨大的救世主,也是另一个伟大的调试工具。