Linux 是谁写的?

Linux 实际上仅仅指 Linux kernel,而不是指由 Linux kernel 和 GNU 工具组成的操作系统,更不是指 RHEL/Fedora/Ubuntu/Debian/Arch/Gentoo 这些发行版。The Linux Foundation 去年9月份发布了一份 Who Writes Linux 2009 调查报告,这个月又发布了新版本的 Who Writes Linux 2010. 自从2005年开始已经有6100多个开发人员和600多家公司参与到 Linux 内核开发,这可能是人类史上最大、参与程度最高、最成功的开源项目。从一个大学生的个人业余兴趣到目前几乎所有重量级 IT 公司都参与的全球协作项目,Linux 开启了一个时代,虽然 Linux 并没有带来创新的内核或技术,但是 Linux 开创了全新的软件开发合作模式和全新的开源商业模式(确切的说是 RedHat 开创的这种商业模式),而这两种模式的创新让 Linux 取得了巨大的成功。

今天,开源的 Linux 已经离不开商业公司的贡献和参与,约有70%的代码来自这些商业公司和专职的开发人员。对 Linux kernel 贡献最大的是 RedHat,而同样开发流行版本 Ubuntu 的商业公司 Canonical 却没有看到踪影,可能 Canonical 把精力都放在了应用和整合上了吧。目前在企业级服务器市场 RedHat 还是绝对老大,Linux 内核代码贡献前两名 David Miller, Ingo Molnar 以及 Alan Cox, Dave Jones, Frank Eigler, Jon Masters 等这些顶级内核黑客都在 RedHat 工作(过)。技术公司的竞争其实就是人才的竞争,谁家的黑客级、大师级高手多谁家就能建立高门槛把竞争对手挡在门外,Ubuntu 要想在短时间内在服务器市场赶上 RedHat 还感觉有点吃力。

who writes linux

Club Uptime:$7.95 512MB OpenVZ VPS

clubuptime

更新:这家公司已经关门了(2011年7月29日)。

CU Family,

We regret to announce that Club Uptime, LLC will be closing its doors, effective immediately. With growing costs and a substantial number of nonpaying clients, we have been unable to continue our business with SoftLayer.

Club Uptime 的域名虽然只有一年多的注册时间,但它的 Founder Matthew 已经在这个行业有很多年的经验,他以前创立的 HostTDS 主要经营独立服务器、虚拟主机等业务,现在主要靠 Club Uptime 专注 VPS 市场. Matthew 也是个经验丰富的 PHP 程序员,甚至开发了自己的 VPS 控制面板 CloudPanel,他们现在用的是 SolusVM,明年一月份将采用自己的 CloudPanel. 他们家现在提供的这款 512MB VPS 使用优惠码 50offlife 可以得到5折永久优惠,也就是说 512MB 只要$3.98每月。他们给的测试 IP (173.192.125.105) 是在 Dallas 的 SoftLayer,虽然 ping 值比西海岸高但是电信和网通访问都还可以接受。不过他们也有 Boca Raton, Florida, New York, Los Angelas, Seattle, Chicago, London 等多个地方的机房。VPS 配置如下:

512MB Guaranteed RAM
1024MB Burstable RAM
10GB 硬盘
100GB 流量
7.95美元每月

服务器硬件配置信息:

All of our servers come standard with Raid 10 across high-speed hard drives, Intel Xeon 3400 or 5600 series processors, and 24GB Ram minimum.

Nginx 使用 Linux-native aio 需要 Linux 内核支持

Nginx 性能优异在于善于利用操作系统内核的各种特性,比如 aio/epoll/sendfile (Linux), kqueue (FreeBSD) 等。对于使用 VPS 做图片站的站长来说,使用 nginx 的 aio 特性会大大提高性能,图片站的特点是大量的读 io 操作,nginx aio 不用等待每次 io 的结果有助于并发处理大量 io 和提高 nginx 处理效率。

前段时间有位客户要用 nginx aio,他用 rpm 升级安装 nginx 到 0.8.5 版本时候发现 rpm 包里的 nginx 没有包含 Linux-native aio (asynchronous I/O) 的支持,所以需要下载 nginx 源代码并带上参数 –with-file-aio 编译。除了要带参数外,Linux 内核还必须有支持这一特性的 api,eventfd(),否则在 nginx 错误日志(/var/log/nginx/error.log)里会看到类似的报错:

eventfd() failed (38: Function not implemented)
worker process 1858 exited with fatal code 2 and can not be respawn

要让 nginx 使用 aio 特性还需要修改 nginx 配置文件:

# vi /etc/nginx/nginx.conf
...
location / {
aio on;
directio 1;
output_buffers 1 128k;
}
...

昨天另一客户遇到 nginx 启动配置都正确却无法看到网页的情况,VPSee 刚开始怀疑是他自己的 nginx 配置有误或者防火墙屏蔽了80端口,后来登录到他的 VPS 上发现 nginx 配置的确没问题,能正常启动,可以 telnet 80 端口,但是不能 get 到网页。打开 nginx 日志也发现 eventfd() failed 的错误提示。后来检查他的 Linux VPS 内核版本是 2.6.18,查了一下 man 帮助发现只有 2.6.22 以后版本才支持 eventfd,解决方法很简单,升级内核就可以了。

Linux-native aio 比传统的 POSIX aio 功能更丰富一些,重要的一点是能通过内核加速提供高性能。直接用 Linux-native aio API 比较晦涩,为了方便使用和开发 Linux-native aio 应用程序我们可以用 libaio/libaio-devel 库。不过 nginx 的作者没有用这些库,因为 nginx 需要 eventfd(),而 libaio 库里只有 0.3.107 版本起才支持 eventfd;nginx 也没有用 glibc,因为 glibc 要到 2.8 版本才支持 eventfd(),为了减少对库的依赖性,nginx 干脆直接用 Linux-native aio API (system calls).

$ vi nginx-0.9.1/src/event/modules/ngx_epoll_module.c
...
#if (NGX_HAVE_FILE_AIO)

/*
 * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly
 * as syscalls instead of libaio usage, because the library header file
 * supports eventfd() since 0.3.107 version only.
 *
 * Also we do not use eventfd() in glibc, because glibc supports it
 * since 2.8 version and glibc maps two syscalls eventfd() and eventfd2()
 * into single eventfd() function with different number of parameters.
 */
...

这里说到了 eventfd(),eventfd 是 Linux-native aio 其中的一个 API,用来生成 file descriptors,这些 file descriptors 可为应用程序提供更高效 “等待/通知” 的事件机制。和 pipe 作用相似,但比 pipe 更好,一方面它只用到一个 file descriptor(pipe 要用两个),节省了内核资源;另一方面,eventfd 的缓冲区管理要简单得多,pipe 需要不定长的缓冲区,而 eventfd 全部缓冲只有定长 8 bytes.

VPS Unlimited:$9.99 256MB Xen VPS

vpsunlimited

VPS Unlimited 的数据中心在 Kansas City 的 WholesaleInternet,WholesaleInternet 是比较有名的一家低价机房,机房官方网站还支持中文。这家 VPS 服务商的域名今年9月份才注册(两个月以前),他们家的 VPS 提供 SolusVM 控制面板,现在购买这款 VPS 使用优惠码:256dc149 首月只要1.49刀,续费6.99刀每月,价格还不错。不过 VPSee 注意到他们母机(host)使用了 32GB 内存,有严重超售的嫌疑(32GB 理论可以分成120个 256MB VPS),虽然有8个硬盘做 RAID10,但是 RAID10 带来的 IO 优势可能不能弥补超售带来的 IO 问题,主要看这家服务商的技术人员实力和看他们怎么去平衡和优化了。他们家还提供14天的退款保证。VPS 配置如下:

256MB RAM
10GB 硬盘
100GB 流量
9.99美元每月

服务器硬件配置信息:

Current Minimum Xen Nodes: Dual Xeon E5410, 32GBs Ram, 8 x 750GB RE3 Hard Drives, Adaptec 5805, Redundant Power Supplies.

在 PC 上安装 Mac OS X Snow Leopard

上周 MacBook Pro 莫名其妙点不亮屏幕了,症状是:黑屏但是系统可以正常运行,如果要使用的话只能接外接显示器来操作,没有屏幕非常不方便,毕竟不是每个地方都有多余的显示器可以用。Google 了一下找到的一些重置 Mac 的技巧都不管用,后来发现 Apple 官方承认这款2007年产的部分 MacBook Pro 在某种情况下会出现屏幕问题(MacBook Pro: Distorted video or no video issues),原因出在 NVIDIA GeForce 8600M GT 显卡。还好 Apple 承诺过了质保期也可以免费维修:

Apple has determined that some MacBook Pro computers with the NVIDIA GeForce 8600M GT graphics processor may be affected. If the NVIDIA graphics processor in your MacBook Pro has failed, or fails within four years of the original date of purchase, a repair will be done free of charge, even if your MacBook Pro is out of warranty.

笔记本已经送到 Apple Store,第一次修 Mac 不太懂流程,老土了一把。昨天接到电话说是显卡和主板之间的问题,打算给我换一个主板,不过没有现成的主板,需要等一周时间,等就等吧,过了质保又是免费,还有什么可以抱怨的呢。VPSee 去年买的 Mac OS X Snow Leopard DVD 是含5个 license 的家庭套装版,MM 用了1个,自己用了2个,刚好还剩2个,别浪费了,昨晚手贱,把家里一台 PC 格了装苹果。

准备工作

  • Intel 处理器电脑(不过有人在 AMD 上安装成功过)
  • 一张空白 CD
  • Mac OS X Snow Leopard 安装光盘

设置 BIOS

BIOS 有几个地方比较重要,需要修改4个地方:

  • Advanced BIOS Features->First Boot Device,确认 CD-ROM 引导启动;
  • Integrated Peripherals->PCH SATA Control Mode,设置成 AHCI;
  • Integrated Peripherals->Onboard SATA/IDE Ctrl Mode,设置成 AHCI;
  • Power Management Setup->HPET Mode,设置成 64-bit model.

主板不同 BIOS 界面可能有差异,不过意思是一样的。

开始安装

先去 tonymacx86 下载 iBoot,解压后得到 iBoot.iso,刻盘,然后用盘启动系统就会得到如下界面:

Boot Hackintosh

换光盘,把 iBoot 光盘取出来,把 Mac OS X Snow Leopard 安装光盘放进去,等待10秒左右然后按 “F5” 就会看到界面上面的字变成 “Mac OS X Install DVD”,按 “Enter” 就进入 Mac OS X 的常规安装了。需要注意的地方可能就是记得先选择 Utilities > Disk Utility 工具分区和格式化硬盘为 Mac 格式:Mac OS Extended (Journaled) ,并且分区选择 Options->GUID Partition Table.

启动系统

安装完系统后,重启仍然需要 iBoot 光盘启动,进入 iBoot 后选择硬盘启动后就进入了 Mac OS X,每次都要用 iBoot 光盘先启动很麻烦,所以需要一个 Boot Loader,仍然到 tonymacx86 下载 MultiBeast,安装完毕后取出 iBoot 光盘就应该可以从硬盘直接引导了。

Troubleshooting

如果 PC 上用的不是 NVIDIA 的显卡一般会因为没有相应的显卡驱动导致屏幕分辨率停留在 1024×768 上不去,一种绕过的办法是(可能有效):

$ sudo vi /Library/Preferences/SystemConfiguration/com.apple.Boot.plist 
...
Graphics Mode
1280x1024x32
...

网上关于在 PC 上安装 Mac OS X 的资料很多,可以参考这篇:iBoot + MultiBeast: Install Mac OS X on any Intel-based PC.

延伸阅读:[TL] Re: [初级] 为何要选择 Mac?为什么国外程序员爱用 Mac?

在 CentOS 5.5 上升级 Xen 到 Xen 3.4.3

2008年 RedHat 收购 Qumranet 以后就一直在家搞他的 KVM,没有对 Xen 做任何升级,RHEL/CentOS 5.5 上默认的 Xen 依旧是很老很老的公元2007年发布的 Xen 3.1.2 版本。更糟糕的是 RedHat 在后续的 RedHat Enterprise Linux 6 里彻底放弃了 Xen. 如果以后想在新版本的 RHEL/CentOS 上用 Xen 的话就需要使用第三方源或者自己动手编译 Xen 源代码。自己编译源代码问题多多,看看前面那篇文章留下的150多个评论就知道会遇到多少麻烦了,所以没有特殊要求的话,VPSee 还是建议直接使用第三方源。

# cd /etc/yum.repos.d/
# wget http://www.gitco.de/repo/GITCO-XEN3.4.3_x86_64.repo
# yum update
# reboot

如果上面的 yum update 没问题的话重启系统就可以了进入 xen 3.4.3 了,如果有问题导致一些依赖需要解决的话可以彻底删除 xen 后重新升级安装:

# yum groupremove Virtualization
# yum groupinstall Virtualization
# reboot

在重启之前最好检查一下 grub 是否配置正确、默认启动是否是 xen.gz-3.4.3:

# vi /boot/grub/menu.lst
...
title CentOS (2.6.18-194.26.1.el5xen)
        root (hd0,0)
        kernel /xen.gz-3.4.3
        module /vmlinuz-2.6.18-194.26.1.el5xen ro root=LABEL=/
        module /initrd-2.6.18-194.26.1.el5xen.img
...

/proc/cpuinfo 里的 CPU flags

Linux 上的 /proc是一个虚拟文件系统,在系统启动后挂载在 /proc 上,/proc 包含了很多内核和系统信息用来展示 Linux 内核是如何展示硬件的,比如在 /proc/cpuinfo 里可以看到一些关于 CPU 的信息,其中的 flags 包含了很多用来表示 CPU 特征的参数:

$ cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts 
acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good
xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 
sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid

具体每个 flag 缩写代表什么意思呢?关于 Linux 的最权威答案永远来自源代码,VPSee 在内核源代码里找到了每个 flag 的相关注释,通过这些注释可以很方便我们理解这些 flags 缩写:

# vi /home/vpsee/linux-2.6.31.8/arch/x86/include/asm/cpufeature.h
...
/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */
#define X86_FEATURE_FPU         (0*32+ 0) /* Onboard FPU */
#define X86_FEATURE_VME         (0*32+ 1) /* Virtual Mode Extensions */
#define X86_FEATURE_DE          (0*32+ 2) /* Debugging Extensions */
#define X86_FEATURE_PSE         (0*32+ 3) /* Page Size Extensions */
#define X86_FEATURE_TSC         (0*32+ 4) /* Time Stamp Counter */
#define X86_FEATURE_MSR         (0*32+ 5) /* Model-Specific Registers */
#define X86_FEATURE_PAE         (0*32+ 6) /* Physical Address Extensions */
#define X86_FEATURE_MCE         (0*32+ 7) /* Machine Check Exception */
#define X86_FEATURE_CX8         (0*32+ 8) /* CMPXCHG8 instruction */
#define X86_FEATURE_APIC        (0*32+ 9) /* Onboard APIC */
#define X86_FEATURE_SEP         (0*32+11) /* SYSENTER/SYSEXIT */
#define X86_FEATURE_MTRR        (0*32+12) /* Memory Type Range Registers */
#define X86_FEATURE_PGE         (0*32+13) /* Page Global Enable */
#define X86_FEATURE_MCA         (0*32+14) /* Machine Check Architecture */
#define X86_FEATURE_CMOV        (0*32+15) /* CMOV instructions */
                                          /* (plus FCMOVcc, FCOMI with FPU) */
#define X86_FEATURE_PAT         (0*32+16) /* Page Attribute Table */
#define X86_FEATURE_PSE36       (0*32+17) /* 36-bit PSEs */
#define X86_FEATURE_PN          (0*32+18) /* Processor serial number */
#define X86_FEATURE_CLFLSH      (0*32+19) /* "clflush" CLFLUSH instruction */
#define X86_FEATURE_DS          (0*32+21) /* "dts" Debug Store */
#define X86_FEATURE_ACPI        (0*32+22) /* ACPI via MSR */
#define X86_FEATURE_MMX         (0*32+23) /* Multimedia Extensions */
#define X86_FEATURE_FXSR        (0*32+24) /* FXSAVE/FXRSTOR, CR4.OSFXSR */
#define X86_FEATURE_XMM         (0*32+25) /* "sse" */
#define X86_FEATURE_XMM2        (0*32+26) /* "sse2" */
#define X86_FEATURE_SELFSNOOP   (0*32+27) /* "ss" CPU self snoop */
#define X86_FEATURE_HT          (0*32+28) /* Hyper-Threading */
#define X86_FEATURE_ACC         (0*32+29) /* "tm" Automatic clock control */
#define X86_FEATURE_IA64        (0*32+30) /* IA-64 processor */
#define X86_FEATURE_PBE         (0*32+31) /* Pending Break Enable */

/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */
/* Don't duplicate feature flags which are redundant with Intel! */
#define X86_FEATURE_SYSCALL     (1*32+11) /* SYSCALL/SYSRET */
#define X86_FEATURE_MP          (1*32+19) /* MP Capable. */
#define X86_FEATURE_NX          (1*32+20) /* Execute Disable */
#define X86_FEATURE_MMXEXT      (1*32+22) /* AMD MMX extensions */
#define X86_FEATURE_FXSR_OPT    (1*32+25) /* FXSAVE/FXRSTOR optimizations */
#define X86_FEATURE_GBPAGES     (1*32+26) /* "pdpe1gb" GB pages */
#define X86_FEATURE_RDTSCP      (1*32+27) /* RDTSCP */
#define X86_FEATURE_LM          (1*32+29) /* Long Mode (x86-64) */
#define X86_FEATURE_3DNOWEXT    (1*32+30) /* AMD 3DNow! extensions */
#define X86_FEATURE_3DNOW       (1*32+31) /* 3DNow! */
...

/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
...
/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */
...
/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */
...

仅有 flags 缩写和注释不足以理解 flag 的含义,但是足够发挥个人的 googleability 了,比如直接搜索 msr 不会得到任何有用信息,但是利用上面的注释搜索 Model-Specific Registers(google “Model-Specific Registers”)就会得到很多信息,学习的过程就是不断提高 googleability 的过程:)

ValueSERVER:$0 128MB OpenVZ VPS

valueserver

ValueSERVER 正在提供免费的 128MB VPS(已经 out of stock 了,不过这家在不断补货),没错,是免费的,有一个问题就是只支持 IPv6,所以要连接上的话必须是原生 IPv6 或者使用 IPv6 tunnel,纯 IPv6 使用起来还是挺麻烦的,要从这个 IPv6 VPS 连上另一个 IPv4 VPS 的话可以使用 tb-tun. 对 IPv6 有兴趣的童鞋可以玩一玩。valueserver.de 和 vps4less.de 是一家,都是 Inline Online Internet Dienste GmbH 下面的业务。他们的这款免费 VPS 只能选择 Debian. VPS 配置如下:

128MB Guaranteed RAM
256MB Burst
10% CPU 限制
5GB 硬盘
100GB 流量
0美元每月

服务器硬件配置信息:

All our VPS Server are hosted on Intel Core2Duo/Core2Quad/XEON or AMD Phenom systems with at least 2×2.4 Ghz and 4MB/8MB L2-Cache; with at least 3 GB of RAM and a 1 TB HDD RAID-5 System.

YardVPS:$7.95 512MB Xen VPS

yardvps

YardVPS 和 PhotonVPS 都是 Profuse Solutions 旗下的业务,刚成立不久的 YardVPS 推出了难以置信的超低价 Xen VPS,512MB 只要7.95刀,如果使用优惠码 YARDSALE 的话还可以打7.5折,折后只要6.76刀,加上 SolusVM 控制面板和 1500GB 的大流量,实在是很超值。他们家还有更便宜的 15美元一年的 OpenVZ VPS,这简直就是虚拟主机的价格啊,不,应该说比虚拟主机还要便宜(Bluehost 的虚拟主机还要6.95刀呢)。他们的数据中心在洛杉矶,对中国大陆的线路应该不错。虽然这是家新开的服务商,但是考虑到他们在这个行业有较深的业务背景和经验,面对如此低价的诱惑还是值得冒险一试的,诱人价格+资深背景,VPSee 推荐。VPS 配置如下:

512MB RAM
1GB Swap
15GB 硬盘
1500GB 流量
7.95美元每月

服务器硬件配置信息:

Xeon E5620 core at 2.4GHz, RAID10

超级计算机11月数据统计

一年前讨论 Linux 发行版的时候提到了一些超级计算机的数据,今年6月份数据有点变化,这次刚发布的11月份超级计算机统计报告的亮点依然是中国,中国的 “天河1A” 第一次拿到冠军宝座,并且前十占有两个席位,排名都很靠前(第一和第三),6月份中国有24台超级计算机上榜,按照国家排名与德国并列第四,这次有42台计算机进入 Top500,仅次于美国。上次上榜的超级计算机的处理能力加起来中国排名第二,这次不管是计算机处理能力还是上榜的超级计算机台数都跃升为第二,短短6个月就造了18台超级计算机并进榜,非常惊讶,难道开始造航母了?(新浪:中国造航母须具备五大科技能力 超级计算机居首

还有一个亮点值得讨论的地方是 Amazon 的云计算集群计算系统(Amazon EC2 Cluster, Xeon X5570 2.95 Ghz, 10G Ethernet)进入 Top500,排名第231位,这是云计算的一次非常大的尝试和进步,VPSee 去年还讨论了 “云计算可以用来替代高性能计算吗?”,当时云计算的性能远远没有达到高性能计算(HPC )的要求,时过一年居然就上了榜,现在普通人用信用卡就可以用上超级计算机服务,这在以前是不敢想象的事情,会不会有人利用这种云计算 HPC 破译密码呢?

Linux 依然是超级计算机的绝对主力,对比6月份数据发现 Linux 总体上升5台,牢牢占有82%的份额,其中 CentOS 上升1台,SLES 9 下降1台,SLES 10 下降2台,SUSE/openSUSE/SLES 系还在下降。以下数据来自:Top 500 Super Computer Sites

操作系统版本 使用的个数 所占百分比 处理器个数
Linux(未知版本) 410 82.00 % 4540212
SLES 9 4 0.80 % 59504
CNK/SLES 9 14 2.80 % 1134592
SUSE Linux 1 0.20 % 26304
Redhat Linux 4 0.80 % 48800
RedHat Enterprise 4 3 0.60 % 14736
UNICOS/SUSE Linux 1 0.20 % 8192
SLES 10 2 0.40 % 14328
SLES10 + SGI ProPack 5 15 3.00 % 135200
RedHat Enterprise 5 2 0.40 % 11928
CentOS 8 1.60 % 114792