今天讲一个跟性能优化无关的案例,通过这个事情分享解决疑难问题的一些方法。
我们在做技术支持的过程中,在解决客户问题的过程中,经常会遇到各种问题和困难,有时候可能只是别人说没有办法了,只能这样了,但是,如果你能够始终保持一种怀疑的态度,坚持一种刨根问底的钻研精神,只要有一股钻劲儿,也许就能在绝望中找到一线转机,奇怪的问题就可能找到原因,艰难的事情就可能找到解决办法。
这是一个关于识别大硬盘的问题。
昨天晚上弄到1点左右,终于解决了一个曾经已盖棺定论的问题,找回了本该早就可用的2T磁盘空间。
1.前传:在新硬盘上差点把数据搞丢
事情是这样的,半年前,为了存储不断增加的重点用户数据,申请买了一块4T的硬盘,一位系统管理员给安装到一台旧服务器上,搞了一个星期多,始终有问题,只能认到1.6T的空间。他反复的重装系统、重新分区等等,最后因为分区操作不当,整个硬盘都认不到了,直接扔给我说是已经尽力了,建议找厂商换一块新的,反正是才买的,还在换新的时间范围内。
问题是,之前格式化好了1.6T的空间,拷入了两家用户的数据库,如果丢失,重新去找用户拷数据,将会比较麻烦。
我觉得一个新硬盘,不可能因为这样使用一下就坏了,于是找了一台机器来接上,通过U盘上的PE进入后,试着用磁盘管理软件DiskGenius来处理,发现硬盘是能够认识的,只是分区不见了,通过“搜索分区表“的功能把分区表给找回来了,一切数据都还在。
这个硬盘就这样安装到了那台服务器上,但是只能使用1.6T的空间,系统管理员说是因为那台机器的主板比较老,认不到超过2T的硬盘空间。
2.偶然发现:硬件是支持大硬盘的
昨天,偶然看到一篇技术文章,其中提到了”GPT分区”这个名词,于是就去了解了一下,很久没接触硬件知识,确实在这方面有知识断层了。
原来,以前的MBR分区,不能识别超过超过2T的大硬盘,所以发展出一种新的分区表方法。但是,缺省情况下,安装Windows时,微软仍然会采用MBR分区。
新硬盘是4T,当时是想让系统管理员安装一个Win2008 R2到这个新硬盘上,但是要识别这种大硬盘,必须采用GPT分区,而操作系统不支持安装到GPT分区上,所以,采用了MBR分区,也就只能识别到1.6T的空间(只划分了这么一块分区),最后也没有安装Win2008。
现在,这台机器使用的是很老的操作系统Windows 2003。
会不会是因为操作系统太老了,而无法识别大硬盘呢?
查了一下硬件情况,该服务器是至强的64位CPU,是支持超过2T的大硬盘的。
网上一搜,原来,即使是WindowsServer 2008 R2、win7也需要打补丁才能只别2T以上硬盘,Windows 2003也有补丁文件。
3.第一关:获取识别大硬盘的补丁
好不容易从CSDN上花了3个积分才下载到补丁文件,结果运行时发现是32位的,而这台服务器是64位的操作系统,装不上。好不容易找到一个64位的补丁,却无法下载,因为我的CSDN帐号积分不够了,除了CSDN,还真搜不到其他可下载的资源,各种网盘上也没有,淘宝上倒有帮人下载的服务。
这个补丁只有不到2M,安装时提示还需要先打一个安全补丁KB932168,还好,也是不到1M的小补丁,很快安装完成并按要求重启了操作系统。
4.第二关:识别超过2T的空间
重启后,仍然只能看到1.6T的空间,不管是操作系统的磁盘管理,还是分区助手这类软件。网上查资料发现,需要先将目前的MBR分区转换成GPT分区。
前面提到的磁盘管理软件DiskGenius,转换分区表类型为GUID格式,转换很快完成,进资源管理器后,发现仍然只有1.6T的分区。
再查资料,有的资料说,要在西捷的官网下载一个软件DiscWizard,安装之后才能识别超过2T那一部分分区。
这个软件居然有284M,虽然我是100M的带宽,但是西捷官网下载却非常慢,用了20几分钟才下载下来,安装时傻眼了,提示不支持服务器版操作系统。
想了想,既然打了操作系统的补丁,也转换成了GPT分区,应该是可以识别大硬盘的。决定重启一下操作系统试试,重启后,欣喜的看到了磁盘总的大小是4T了。
5.第三关:重新识别分区
新的空间是空白的,于是用傲梅分区助手把这块新空间进行分区。
完成之后,居然无法识别以前的1.6T的盘,吓了我一跳。
再次祭出重启大法,还好,重启后仍然提示两个分区盘识没有格式化。
这时已经接近凌晨1点了,有点昏昏欲睡了,提醒自己冷静想想,是不是哪一步做错了。
再次使用磁盘管理软件DiskGenius,通过“搜索分区表“的功能重建该盘的分区表,还好,一切数据都还在,终于顺利识别到了完整的磁盘空间。
解决这个问题,靠的是敢于怀疑,靠的是一股钻劲儿。
另外说一个解决疑难问题的案例,这是一个关于开发方面的问题。
在Win7操作系统中,如果开启了输入法,运行源码,显示出欢迎界面后,再显示登录窗口时,一闪而过,终止运行后,开发工具崩溃。
我们开发团队中,可能有不少的开发人员还因为这个问题而多次丢失过编写的代码,有时稍不注意,就因为忘了关闭输入法,一调试,程序就崩了。
曾经有一回,反复测试了很多次,通过跟踪分析,大致确定了是输入法的问题,但一直没有找到解决办法。
最近一位开发人员做了一个变通方法(其实之前可能很多人也这样用过,只是没有提交到代码服务器),显示出欢迎界面后,先弹出一个提示窗口,这样就可以正常显示后续的登录窗口,但这种方法每次都要去点一下“确定”按钮。
因为这样使用起来不爽,所以,我决定再试一下,看能不能找到真正的原因。
通过对代码进行一层一层的做减法,最终发现,即使没有任何额外的代码,也会再现这个问题,说明这是个通用性的问题。
既然登录窗口闪了一下就不见了,是不是可以强制让它再显示出来呢?于是用一个API函数SetActiveWindow来激活登录窗口,果然,就这样解决了这个影响大家很多年的问题。
解决这个问题,采用的是常用的解决疑难问题的办法,通过做减少来排除各种不相关的因素,最终止确认问题发生的根本原因,再用针对性办法去试探解决。
前段时间,解决的另外一个疑难问题:跨网段无法访问虚拟机上的RAC系统。
也是同样的道理,网络管理人员说,听其他人也反馈过类似的问题,可能是虚拟机软件Oracle VM VirtualBox本身的问题。最终,自己通过手动添加一条路由表记录来解决了,结果并不是虚拟机软件的问题。
别人说的原因,有时要有怀疑的态度,有自己的分析和判断。
虽然这三个事例跟性能优化无关,但是我们很多时候在做性能调优的过程中也会遇到类似的问题,有时听别人描述的问题现象可能跟事实有偏差,有时已经下了定论的事情也许还有解药,需要一种刨根问底的精神,需要一股钻劲儿,才能解决那些疑难杂症。
领取专属 10元无门槛券
私享最新 技术干货