Singleton和多线程

最简单的Singleton代码如下:

class Singleton
{
public:
    Singleton & getInstance()
    {
        static Singleton _s;
        return _s;
    }
private:
    Singleton(){}
};

或者

class Singleton
{
public:
    static Singleton * getInstance()
    {
        if(_s == NULL)
            _s = new Singleton();
        return _s;
    }
private:
    Singleton(){}
    static Singleton * _s;
};
Singleton * Singleton::_s=NULL;

如果getInstance会被多线程执行呢?第二种方式中,很明显if判断处是个race condition。那么第一种方式会不会有问题呢?可以想象,static变量只初始化一次肯定也是通过某个条件判断实现的。就要看编译器实现这个判断的时候有没有加锁了。很可惜,没有从编译器的文档中找到该说明,不过从msdn博客看到一篇文章说明了静态变量初始化在多线程情况下也是存在race …

more ...

如何用C/C++扩展Python的功能

用c/c++扩展Python功能,说简单点就是python中调用c/c++代码,比较基础的有两种方式:

  1. 使用Python的C语言接口,即通过PyObject,这篇文章介绍比较详细。
  2. 使用ctypes直接导入c/c++动态库,如何使用点这里

第一种方式编写c/c++接口稍微麻烦一点,但是在python代码中使用该接口会十分方便,如同使用内置模块一般;第二种方式则可以直接使用原有的c/c++动态库,即使没有源文件也可以使用。

两种使用方式在其他方面,比如效率,是否还有区别,目前还没有研究过。

more ...

申请域名和空间

1. 申请域名

在万网上申请一个cn域名,大概每年39左右,不过cn的域名需要先提交资料备案后才能使用,这有点令人不爽。因此果断选择了com域名,虽然也要提交资料审批,但是审批结果并不影响域名的使用。

选择com域名也不是没有代价的,代价就是每年多了20块钱,另外据说com域名有时可能不能正常解析,原因不能说,大家懂的。

万网上买个5年期的com域名,295元,都不够春节回家的路费,“一咬牙一狠心”也就买了,反正快捷支付只是输入了用户名密码,也感觉不到花了钱。

2. 申请站点空间

站点空间是用来干嘛的?可以理解为一个做了一些权限限制的远程主机,可以用来放你的web server。当然大部分站点空间供应商都已经提供了web server,你只需要将你的站点内容上传就可以了。
为什么不可以把网站内容放在用自己的电脑上呢?

一来是你可能没有固定的IP;二来是你的个人电脑也不能一直开着吧,就算不管电脑耗费,电费也不便宜呀,特别现在还发明了这么有创新意义的阶梯电价。如果这两个问题你都能解决,放在自己的电脑上也是个不错选择,省了一笔银子。

所以申请站点空间相对麻烦一点,不是因为操作复杂,而是因为站点空间的收费比域名要高的多,不敢再一买买个5年了。而且国内的一些VPS对流量的限制也比较严格,最好是先估算网站需要的空间和流量后再来选择一个合适的套餐。

对于个人用户来说,稳定性要求相对没那么高,免费的站点倒是个不错的选择。

尝试申请了Zymic …

more ...

使用wordpress搭建个人站点

1. 安装mysql

  1. 从mysql官网下载源码5.5.24源码地址
  2. 下载并安装cmake,用来生成makefile。2.8.9地址
  3. 解压mysql-5.5.24.tar.gz,进入解压后的目录
  4. 运行cmake -i,设置三个变量:CMAKE_INSTALL_PREFIX,MYSQL_DATADIR,SYSCONFDIR,其他默认即可。
  5. 运行make && make install
  6. 进入mysql安装目录,即CMAKE_INSTALL_PREFIX指定地址,运行nohup ./bin/mysqld &启动mysql

2. 安装apache

  1. 从apache官网下载地址找一个合适镜像下载源码。我选择的是北交大的镜像
  2. 选择需要的版本下载,然后tar –zxvf解压.tar …
more ...

Linux系统和性能监控(6)

原文Linux System and Performance Monitoring,作者Darren Hoch。

6.0 I/O监控相关

磁盘IO子系统是Linux系统中最慢的一部分。这主要是因为磁盘距离CPU较远以及磁盘工作的时候需要机械操作(磁盘转动及机械臂运动)。如果访问磁盘像访问内存一样只需要花费分钟和秒级别的时间,这就是7天和7分钟的差异。因此,Linux内核尽量减少磁盘读写量是及其必要的。下面几段描述了内核从磁盘读数据到内存和写回的几种方式。

6.1 读写数据——内存页

Linux内核是按页来读写磁盘的。一般Linux系统上默认的页大小是4KB,系统读写磁盘块的时候是以4KB为单位进行的。你可以通过time命令verbose模式的Page Size来查看你系统上的页大小。

image

6.2 大小缺页

正如大部分Unix系统一样,Linux使用的是虚拟地址,然后将虚拟地址映射到物理内存空间。映射的操作是用时建立的,即当一个进程启动时,内核只会将那些使用到的虚拟地址映射到实存中。当一个应用启动的时候,内核会依次查找CPU缓存和物理内存,如果都没有找到所需的数据,内核会触发一个大缺页(major page fault, MPF)中断。一个MPF中断会要求磁盘子系统从磁盘检索所需的页并将它们缓存到内存中。

一旦内存页(磁盘数据)被映射到了缓存中 …

more ...

Linux系统和性能监控(5)

原文Linux System and Performance Monitoring,作者Darren Hoch。

5.0 虚拟内存相关

虚拟内存使用磁盘作为内存的扩展,这样可用的“内存”就更多了。在内存不够时,内核会把最近没有使用的内存块写到磁盘上去。当这部分内存再次被访问时,会把这部分内容再从磁盘读取到物理内存中。这些操作对用户是完全透明的,Linux上的应用程序只是看到有大量的内存可用,但是不知道这些“内存”有部分是存储在磁盘上的。毫无疑问,读写磁盘比读写真正的内存要慢得多(顺序读写大概比内存慢1000倍),因此程序读写内存的时候,如果使用了大量的虚存,程序运行就慢了。磁盘作为虚存使用的那部分叫做交换空间/分区(swap space)。

5.1 虚存页

虚存是按页进行划分的,X86架构上的虚存页大小是4KB。内核进行虚存读写的时候,是按页进行的。内核在某些时候会将内存页写到交换空间和文件系统中。

5.2 内存同步(原文:kernel memory paging)

内存同步是一个常见的操作,不要和内存交换 …

more ...

Linux系统和性能监控(4)

原文Linux System and Performance Monitoring,作者Darren Hoch。

4.0 CPU性能监控

CPU性能表现如何一般从三个方面来衡量:运行队列、利用率和上下文切换。正如前文所提及的,性能表现的好坏和基线数据(或预期)是密不可分的。对大部分系统而言,一些基本的性能预期如下:

  • 运行队列——每个处理器运行队列中不应该超过1-3个线程。例如,一个双核的系统中,运行队列长度不应该超过6。(译注:即一个系统的load average值不应该大于核数的4倍。)
  • CPU利用率——假如CPU被充分利用了,那么必须达到以下的占比划分:
  • User Time占65%-70%
  • System Time占30%-35%
  • Idle占0%-5%
  • 上下文切换——上下文切换的次数和CPU利用率相关。假设CPU利用率达到了上述的占比划分,大量的上下文切换也是可以接受的。

Linux系统有很多工具可以用来统计这些指标。我们将首先来看vmstat和top。

4.1 vmstat工具的使用

vmstat带来的额外性能开销很小,因此,在一个高负载系统上一直运行该工具是可行的 …

more ...

Linux系统和性能监控(3)

原文Linux System and Performance Monitoring,作者Darren Hoch。

3.0 CPU简介

CPU的利用率很大程度取决于运行什么类型的任务。内核调度器服务于两种任务:线程(单或多)和中断。调度器赋予不同任务以不同的优先级,下面是各个任务的优先级排序:

  • 中断——设备通知内核完成了某个操作。比如网卡发送了一个网络包或者某个硬件驱动产生了一个IO请求。
  • 内核进程——所有的内核进程以此优先级运行。
  • 用户进程——即通常所说的用户态。所有的软件应用以用户态运行。在内核调度机制中,用户态优先级最低。

为了便于理解内核如何管理和调度这些任务,下面将介绍一些重点概念:上下文切换、运行队列及利用率。

3.1 上下文切换

大部分现代处理器只能同时运行一个单线程进程或者一个线程。N路超线程或N核处理器则可以同时运行N个线程。其实Linux内核把多核处理器中的每一个核看成一个独立的处理器,例如一个单处理器双核的系统在Linux内核看来就是一个双处理器的系统。

一个标准的Linux内核支持“同时”运行50-50000个线程,如果只有一个CPU,内核必须公平地调度这些线程。每一个线程会被分配一个CPU时间片,一旦线程用完了该时间片或者被更高优先级的任务(比如硬件中断)抢占,线程就会被放回运行队列中,而更高优先级的任务将占用CPU。这种线程之间的切换被称作为上下文切换 …

more ...

Linux系统和性能监控(2)

原文Linux System and Performance Monitoring,作者Darren Hoch。

2.0 安装监控工具

大部分Unix系统发布的时候会自带一系列的监控工具,这些监控工具自Unix诞生起就已经成为系统的一部分了。Linux把这些监控工具作为系统的一部分或者附件发行。基本上,所有的Linux发行版本都有包含这些工具的安装包。尽管类似的开源和第三方的监控工具也不少,这篇文章主要还是介绍这些内建工具的使用。

本文将介绍如何应用下列工具来监控系统性能:

Tool Description Base Repository
vmstat all purpose performance tool yes yes
mpstat provide statistics per CPU no yes
sar all purpose performance monitoring tool no yes
iostat provides disk statistics no yes …
more ...

Linux系统和性能监控(1)

原文Linux System and Performance Monitoring,作者Darren Hoch。

1.0 性能监控介绍

性能调优是一个寻找系统瓶颈并调节操作系统以消除这些瓶颈的过程。许多系统管理员认为性能调优就像按菜谱做菜一样:简单设置几个系统参数就可以解决一个问题。其实不是这样的,性能调优是在调节操作系统的各个子系统,以期在他们之间取得一种平衡,达到所需的最佳性能。这些子系统包括:CPU、内存、 IO、网络。

这些子系统之间高度依赖,其中任意一个子系统出现使用瓶颈都很可能导致其他子系统出现问题。比如:

  • 大量的内存读入请求会塞满内存队列
  • 大量的网络吞吐能够耗尽CPU资源
  • 为了保持内存队列空闲可能会耗尽CPU资源
  • 大量内存到磁盘写请求可能耗尽CPU和IO资源

为了调优一个系统,首先必须定位到瓶颈在哪里。有时候看起来是某个子系统出现了问题,但实际可能是另外一个子系统过载引起的。

1.1 判断应用的类型

为了理解从哪里开始调优性能,最重要的是先分析和理解一个系统的表现。应用一般被分为两类:

  • IO型:IO型应用会消耗大量的内存及其下的存储系统,这是因为IO型的应用会(在内存中)处理大量的数据。IO型的应用一般来说不会消耗太多的CPU和网络资源(除非存储系统是构建在网络之上的)。IO型的应用一般只使用CPU来产生一个IO请求然后就进入睡眠状态了。数据库通常被认为是一个的IO型应用。
  • CPU型:顾名思义 …
more ...