又一台VPS悲剧了

hostitek台湾的vps,SSD硬盘出问题,商家已换新的硬盘,我的数据估计全丢了,还好自己有备份。以前有人说过hostitek的vps丢过数据,我只喜欢他们的网速特好,主机性能也很好,想不到悲剧发生了,他们也没有备份,如果他们有备份,不超售,那就是非常好的vps。如果openVZ的VPS不超售,性能肯定比XEN的强。为什么linux主机的硬盘这么容易坏呢???

博客只好搬到diahosting的美国主机,diahosting很久以前用过,硅谷机房延迟低,网速不错,且RAID10。

wordprees的优化有两篇文章非常好,本人就在用。

WordPress 内存缓存终极加速插件:Batcache

WordPress 如何启用 Memcached 内存缓存

CURL全局初始化问题

最近一个例子调试很久才找到问题。

情况是这样的

A函数里先调用B函数,再调用C函数。

C函数要用到curl openssl版的,在C函数开始部分curl_global_init(CURL_GLOBAL_ALL); 全局初始化,在结尾部分curl_global_cleanup();全局释放。

假如B函数也用到了openssl。这个A函数如果在main函数里执行一遍是没有问题的。如果在主函数里执行两遍以上A函数,问题就会出现了。最后查找原因是因为curl_global_cleanup();把openssl给释放了。造成第二次执行A再执行B的时候B出问题了,间接造成B出问题。

结论:curl_global_init(CURL_GLOBAL_ALL); 一定要放在主程序开头。curl_global_cleanup();函数一定要放在主程序结尾

 

北京电信通云主机试用

凌云1型云主机配置详情
操作系统: Windows2003 
CentOS 5.6 Ubuntu12.4  
CPU: Intel XEON E5620 2.40GHz 四核至强 x 四核
内存配额: 2GB DDRIII 
硬盘容量: 160G SAS(系统盘15G) + 160G SATA 备份 
独立IP地址: 1
个(可增值)
带宽: 5MB独享(BGP多线 千兆光纤)

[root@localhost ~]# cat /proc/cpuinfo
Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
bogomips : 4800.17
分配四核

[root@localhost ~]# free -m
Mem:          2010        762       1247          0        172        464
Swap:         3039          0       3039

[root@localhost ~]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
268435456 bytes (268 MB) copied, 6.08845 seconds, 44.1 MB/s
268435456 bytes (268 MB) copied, 5.01624 seconds, 53.5 MB/s
268435456 bytes (268 MB) copied, 8.13692 seconds, 33.0 MB/s
三次结果

[root@localhost ~]# wget http://cachefly.cachefly.net/100mb.test
2012-07-12 15:44:25 (5.55 MB/s) - `100mb.test' saved [104857600/104857600]
下载没有限死5M

安装lnmp
real 43m38.374s
user 30m43.729s
sys 5m5.279s

==============================================================
BYTE UNIX Benchmarks (Version 4.1-wht.2)
System -- Linux localhost.localdomain 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 EST 2011 x86_64 x86_64 x86_64 GNU/Linux
                      17171932   4009788  12275772  25% /

Start Benchmark Run: Thu Jul 12 21:55:32 CST 2012
 21:55:32 up 12 min,  1 user,  load average: 0.00, 0.12, 0.19

End Benchmark Run: Thu Jul 12 22:06:01 CST 2012
 22:06:01 up 22 min,  1 user,  load average: 16.32, 6.74, 3.02
                     INDEX VALUES           
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        376783.7  9483854.6      251.7
Double-Precision Whetstone                      83.1      984.6      118.5
Execl Throughput                               188.3     4854.7      257.8
File Copy 1024 bufsize 2000 maxblocks         2672.0   128499.0      480.9
File Copy 256 bufsize 500 maxblocks           1077.0    37479.0      348.0
File Read 4096 bufsize 8000 maxblocks        15382.0   803257.0      522.2
Pipe-based Context Switching                 15448.6   398829.5      258.2
Pipe Throughput                             111814.6  1579872.6      141.3
Process Creation                               569.3    15029.2      264.0
Shell Scripts (8 concurrent)                    44.8     1023.7      228.5
System Call Overhead                        114433.5  1387549.9      121.3
                                                                 =========
     FINAL SCORE                                                     243.6

一次惨痛的教训

最近做一个程序,想删除某个文件夹,第一个想到的是win32API RemoveDirectory 后来发现这个函数不能删除非空目录。后来去上网上在资料,找到了两种 

bool DeletePath(char * lpszPath)
{
	if(!lpszPath) return false;
	SHFILEOPSTRUCT FileOp={0};
	//允许放回回收站 不出现确认对话框 不显示一个进度对话框 不显示出错用户界面
	FileOp.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION|FOF_SILENT|FOF_NOERRORUI;
	FileOp.pFrom = lpszPath; //路径
	FileOp.pTo = NULL; //一定要是NULL
	FileOp.wFunc = FO_DELETE; //删除操作
	return (SHFileOperation(&FileOp) == 0);
}

 

 这种经常出问题,且不通用。

bool deleteDirectory(const char* pszDir)
{
	WIN32_FIND_DATA fd;
	char szTempFileFind[MAX_PATH] = { 0 };
	bool bIsFinish = false;
	ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
	sprintf(szTempFileFind, "%s*.*", pszDir);

	HANDLE hFind = FindFirstFile(szTempFileFind, &fd);
	if(hFind == INVALID_HANDLE_VALUE)
		return false;
	while (!bIsFinish) //删除非空目录下的所有文件以及目录
	{
		bIsFinish = (FindNextFile(hFind, &fd)) ? false : true;
		if ((strcmp(fd.cFileName, ".") != 0) && (strcmp(fd.cFileName, "..") != 0))
		{
			char szFoundFileName[MAX_PATH] = { 0 };
			strcpy(szFoundFileName, fd.cFileName);
			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //判断是不是目录
			{
				char szTempDir[MAX_PATH] = { 0 };
				sprintf(szTempDir, "%s%s", pszDir, szFoundFileName);
				deleteDirectory(szTempDir);
			}
			else
			{
				char szTempFileName[MAX_PATH] = { 0 };
				sprintf(szTempFileName, "%s%s", pszDir, szFoundFileName);
				DeleteFile(szTempFileName);
			}
		}
	}
	FindClose(hFind);

	if (!RemoveDirectory(pszDir)) //删除已清空了内容的目录
		return false; return true;
}

 

这个函数貌似没什么问题,而其我还增加了入口检查,判断pszDir是否为非空。但是悲剧的是如果我传的是没有字符的字符数组,问题就来了。
sprintf(szTempFileFind,  "%s*.*",  pszDir);  如果pszDir是没有字符的空字符数组时 szTempFileFind 就会是 *.* 。这个值等于这个盘的顶层目录,如d:,最后的悲剧就是你整个D盘的东西就全部会被删除。假如你里面有写了几个月的代码。。。
这个教训告诉我 不能乱抄网上的代码。。。T_T