分类目录: 软件技术

DRBD远程实时双机热备系统配置完全手册

今天本来想按照之前的计划,分析一下drbd的源码,看到/proc/drbd文件的实现方式时,就想打开drbd服务切实看一下,结果发现几年前配置过的drbd已经不能再使用了,还是先把配置过程完整再尝试一下,以便记录在这里分享出来。

首先需要准备两台虚拟机,可以使用vmware或者virtualos。本文主要针对drbd的配置和使用过程,虚拟机安装部分不作详述。

步骤:

(一)安装虚拟机

安装配置Linux OS,目前桌面版的Linux系统都是免费的,可以很容易获取到安装镜像源。常用的有:Ubutun、Fedora和OpenSuse,可以自行选用。

(二)给虚拟机配置网络

最好都能上外网,以便下载安装常用软件包。

(三)安装drbd软件

上述的Linux桌面发行版自带的安装源中都能找到drbd的安装包。如果没有,那么需要自行下载源码编译安装,这样安装过程中一般会出现不少问题,Google或者百度能解决。

这里以我的两个虚拟机为例:
visual_machine_linux 
在做drbd实验之前,需要对虚拟机做快照备份,防止中途OS崩溃无法启动后可以回退。

系统配置:
虚拟机1
[root@t ~]# hostname
t
[root@t ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:07:3D:A8
inet addr:192.168.1.104 Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe07:3da8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:280652 errors:0 dropped:0 overruns:0 frame:0
TX packets:2326851 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:26215565 (25.0 MiB) TX bytes:3493042943 (3.2 GiB)
Interrupt:19 Base address:0x2024

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@t ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.1.104 localhost.localdomain localhost localhost t
::1 localhost6.localdomain6 localhost6
192.168.1.106 Shentar

192.168.1.104 ME

[root@t ~]#

虚拟机2
[root@Shentar /]# hostname
Shentar
[root@Shentar /]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:39:C4:28
inet addr:192.168.1.106 Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe39:c428/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2327200 errors:0 dropped:0 overruns:0 frame:0
TX packets:280717 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3492827412 (3.2 GiB) TX bytes:26300053 (25.0 MiB)
Interrupt:19 Base address:0x2024

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@Shentar /]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.1.106 localhost.localdomain localhost localhost Shentar
::1 localhost6.localdomain6 localhost6
192.168.1.104 t

192.168.1.106 ME

(四)在配置好了虚拟机之后,给每个虚拟机增加一块硬盘,用作drbd的镜像源。

准备供drbd管理的磁盘,对于虚拟机很方便,直接添加硬盘即可。添加步骤:

  1. 打开虚拟机的设置对话框:

    wps_clip_image-26891
  2. 点击add按钮

    wps_clip_image-27328
  3. 一路next即可。
  4. 添加完成后的虚拟机配置如下:

    wps_clip_image-27459 
    启动虚拟机

    使用fdisk -l命令会发现系统中多了一块硬盘设备:

    [root@Shentar ~]# fdisk -l

    Disk /dev/sdc: 3221 MB, 3221225472 bytes
    255 heads, 63 sectors/track, 391 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: 0x00000000

    Disk /dev/sdc doesn't contain a valid partition table

    注:这里的显示内容中已经将其他无关的磁盘信息删除。
  5. 对新加的硬盘创建分区,按照如下步骤执行即可:
    [root@Shentar ~]# fdisk /dev/sdc

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-391, default 1):
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-391, default 391):
    Using default value 391

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.
    [root@Shentar ~]# fdisk -l

    Disk /dev/sdc: 3221 MB, 3221225472 bytes
    255 heads, 63 sectors/track, 391 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: 0x2a28d263

    Device Boot Start End Blocks Id System
    /dev/sdc1 1 391 3140676 83 Linux

(五)配置drbd.conf文件

两台虚拟机都配置完毕后,可以配置drbd.conf文件了。我的两台虚拟机的配置文件如下

[root@Shentar ~]# cat /etc/drbd.conf 

#
# please have a a look at the example configuration file in
# /usr/share/doc/packages/drbd.conf
#
resource r0 {
protocol C;

startup {
wfc-timeout 2000;
degr-wfc-timeout 6000;
}

syncer {
rate 50M;
}

disk {
on-io-error pass_on;
}

on Shentar {
device /dev/drbd2;
disk /dev/sdc1;
address 192.168.1.106:7789;
meta-disk internal;
}

on t {
device /dev/drbd2;
disk /dev/sdc1;
address 192.168.1.104:7789;
meta-disk internal;
}
}

两台虚拟机的配置完全一样即可。

 
(六)创建drbd资源

执行如下两条命令创建drbd资源:

[root@Shentar ~]# drbdadm create-md r0

[root@t ~]# drbdadm create-md r0

其中r0是配置文件中指定的资源名。

(七)初次启动drbd

  • 启动两台虚拟机上面的drbd服务。

/etc/init.d/drbd start

先启动的一台虚拟机会等待另外一台,一直停留在如下等待画面:

[root@t ~]# /etc/init.d/drbd start

Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 6000 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 2000 seconds. [wfc-timeout]
(These values are for resource '
r0'; 0 sec -> wait forever)
To abort waiting enter '
yes' [ 30]:

等待另一台启动后,会自动完成启动。

  • 查看系统进程,会发现多了3个drbd相关的进程:
[root@t ~]# proc

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S< 0 0:00 [kthreadd]
2 2966 0 0 ? -1 S 0 0:00 \_ [drbd2_worker]
2 2975 0 0 ? -1 S 0 0:00 \_ [drbd2_receiver]
2 3014 0 0 ? -1 S 0 0:00 \_ [drbd2_asender]

我的理解,drbd2_worker为本地磁盘管理内核线程,drbd2_receiver为接受对端同步数据的线程,drbd2_asender为本地发送数据到对端内核线程。

此时,使用drbd内核线程的状态,会发现二者已经建立联系:

[root@t ~]# cat /proc/drbd 

version: 8.3.5 (api:88/proto:86-91)

GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@t, 2010-05-22 10:36:02

2: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----

ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:3140544

检查drbd是否创建了设备drbd2:

[root@t ~]# l /dev/drbd2 

brw-r----- 1 root disk 147, 2 2013-07-14 16:04 /dev/drbd2

[root@t ~]#

说明drbd的磁盘设备已经创建成功了。

/proc/drbd 文件是内核线程写的,当用户态打开该文件时,内核线程会将此时本端监控到的连接状态反馈给用户。PS:从这里可以看出,我的drbd是在2010年编译安装的,这个时间也够久远了。

到这里已经可以确认drbd安装、配置成功了。

但是还需要强制指定一端为主,并在新的drbd设备上面创建文件系统,方能挂载到系统使用。

  • 在其中一个节点执行如下命令,强制置主:

[root@t ~]# drbdsetup /dev/drbd2 primary -o

此时再查看drbd的工作状态,会发现两台主机的drbd之间已经在同步数据了,同步速度为50M/s,这个速度是配置文件中指定的。


[root@t~]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:SyncSourcero:Primary/Secondaryds:UpToDate/InconsistentCr----
ns:372792nr:0dw:0dr:380960al:0bm:22lo:1pe:13ua:256ap:0ep:1wo:boos:2768160
[=>..................]sync'ed:12.0%(2768160/3140544)K
finish:0:01:06speed:41,376(41,376)K/sec

不必等待同步完成,已经可以在主端创建文件和使用了,但是在数据同步完成之前不能倒换或者强制重启的动作,否则会出现主备数据不一致的问题,导致“脑裂”出现。

数据同步完成后,状态显示为:


[root@t~]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:Connectedro:Primary/Secondaryds:UpToDate/UpToDateCr----
ns:3140544nr:0dw:0dr:3140544al:0bm:192lo:0pe:0ua:0ap:0ep:1wo:boos:0

  • 对drbd虚拟设备做文件系统:

[root@t~]#mkfs.ext3/dev/drbd2
mke2fs1.40.8(13-Mar-2008)
Warning:256-byteinodesnotusableonoldersystems
Filesystemlabel=
OStype:Linux
Blocksize=4096(log=2)
Fragmentsize=4096(log=2)
196608inodes,785136blocks
39256blocks(5.00%)reservedforthesuperuser
Firstdatablock=0
Maximumfilesystemblocks=805306368
24blockgroups
32768blockspergroup,32768fragmentspergroup
8192inodespergroup
Superblockbackupsstoredonblocks:
32768,98304,163840,229376,294912
Writinginodetables:done
Creatingjournal(16384blocks):done
Writingsuperblocksandfilesystemaccountinginformation:done
Thisfilesystemwillbeautomaticallycheckedevery38mountsor
180days,whichevercomesfirst.Usetune2fs-cor-itooverride.

注意,文件系统只在一端做即可,另一端会在数据同步完成后就自动有文件系统了。同样创建的文件的权限也会同步到对端。因此两边操作系统的同名用户的用户id和组id也要完全一样,否则会出现同名用户创建的文件到了对端后出现该用户无法访问的问题。该问题在不指定用户id创建系统用户时比较容易出现,也比较隐藏。

  • 现在就可以挂载使用drbd的虚拟磁盘设备/dev/drbd2 了。

[root@t/]#mkdirdrbd2/
[root@t/]#mount/dev/drbd2/drbd2

无出错提示,则挂载成功。

下面就可以在用户态下使用drbd的分区了。

  • 做一个最简单的试验,在主节点创建一个文件,然后倒换到备,在备上面查看该文件:

[root@t/drbd2]#echo'hellodrbd!'>./justatest.txt
[root@t/drbd2]#catjustatest.txt
hellodrbd!
  • 然后倒换drbd。

在主端执行如下命令:


cd/
umount/drbd2
drbdadmsecondaryall
[root@t/drbd2]#cd/
[root@t/]#umount/drbd2
[root@t/]#drbdadmsecondaryall
[root@t/]#cat/proc/drbd
version:8.3.5(api:88/proto:86-91)
GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fbbuildbyroot@t,2010-05-2210:36:02
2:cs:Connectedro:Secondary/Secondaryds:UpToDate/UpToDateCr----
ns:3256620nr:0dw:116076dr:3140673al:41bm:221lo:0pe:0ua:0ap:0ep:1wo:boos:0
[root@t/]#

在备端执行如下命令:


[root@Shentar/drbd2]#drbdadmprimaryall
[root@Shentar/]#mkdir/drbd2
[root@Shentar/]#mount/dev/drbd2/drbd2

然后再查看备端的文件是否同步成功:


[root@Shentar/drbd2]#cd/
[root@Shentar/]#cd/drbd2/
[root@Shentar/drbd2]#catjustatest.txt
hellodrbd!
[root@Shentar/drbd2]#

可以看到备端没有作文件系统,但是可以直接挂载磁盘,并打开主端同步过来的文件。

 (八)后面就可以在drbd上面架数据库或者其他对文件持久化要求比较高的应用了。

Drbd在文件系统下层,直接管理块设备的块,因此如果是上层应用自身将数据结构破坏,那么坏的数据也会被同步到对端。如果是一端磁盘损坏,那么倒换后,也许数据还是好的,可以继续起上层应用,起到容灾的作用。Drbd不会自动倒换,需要在双机控制应用程序中写监控和倒换脚本来控制。

| 1 分2 分3 分4 分5 分 (5.00- 5票) Loading ... Loading ... | 同时归档在:DRBD | 标签: , , |

Netty和Jetty的Java NIO 网络框架模型分析

Netty的NIO框架模型。在以前的文章中,为解决Jetty的问题,分析过Java NIO基于多路事件分离器的异步IO框架模型。一直都没有系统分析Netty和Jetty的网络模型,这两天将二者的网络框架部分的代码仔细读了一下,整理了二者的网络模型,画出了Netty的模型图:

netty_network_frame_model

在图中,每个侦听都会创建一个Acceptor Reactor,由Boss线程来监控多路分离器,这里只关注连接事件,当有新的建立连接请求达到时,该线程会第一时间响应,将接收到的请求注册到事件多路分离器中,事件多路分离器有多个,默认情况下其个数为CPU核心数的两倍,应该是CPU超线程的数目。这里会给每一个达到的连接编一个序号,将序号对分离器个数取模(hash到0~3的一维空间),根据模值分配给相应的分离器。事件分离器开始监听新的连接上面的读写事件。检查线程为NioWorker。读写数据会通过回调用户注册的handler的相应接口来实现。因此,处理耗时数据的情况下,需要用户将其提交给后台线程,而不应该阻塞事件分离器,否则会导致新的连接无法建立,其他并发请求无法处理。

Jetty在代码风格上面跟Netty差别很大,看jetty代码感觉更清晰一点,可能是因为以前处理问题已经看得非常多了。前面的文章也说过,Jetty是在一个线程中调用一个同步的accept()方法来等待新的连接请求,等到新的连接到来时,就生成新的change事件放到多路分离器中,同样也是有多个多路分离器,选取原则与Netty完全一样。简单的轮询实现负载均衡。这是典型的半同步半异步(Half-Sync/Half-Async)的模式。在只使用1个事件分离器时,会发现分发线程通常会引入很多问题。前面两篇文章中提到的问题分析都跟这个有关。

不知道Jetty与Netty为什么在接受新请求这里有差别,难道Netty的方式更利于处理短连接,而Jetty则更利于处理长连接,比如Http连接?优待进一步的并发测试才能说明问题。如果netty的方式很好,那么Jetty应该也早就改成了该方式。

| 1 分2 分3 分4 分5 分 (5.00- 9票) Loading ... Loading ... | 同时归档在:IO编程, Jetty, Netty | 标签: , , |

分布式存储知识学习清单(完善中)

分布式存储是云存储和云计算的基石。没有特别深入的存储基础知识,但是对分布式存储比较感兴趣。希望以不同的开源存储系统的架构特点和细节组成一条学习的主线,以点带面的掌握主流的架构、算法和适用场景。

1、DRBD

1)磁盘IO的截获和处理流程;
2)同步和异步IO复制流程
3)内核态与用户态交互流程
4)文件系统、VFS和块IO之间的关系

2、Ceph

1)对象接口
2)分布式存储的元数据与数据节点分离架构

3、VFS

1)内核知识点
2)本地文件系统

4、关系数据库

1)PostgreSQL、Sqlite,SQL语法,DB文件组织的数据结构

5、算法

1)PAXOS算法:Chubby、BigTable、GFS论文
2)NoSQL、Cassandra、Voldemort,节点间消息通讯模型,多副本一致性保障。
3)CAP定理相关

| 1 分2 分3 分4 分5 分 (4.80- 10票) Loading ... Loading ... | 同时归档在:C/C++, Java, Linux内核, 算法数据结构 |

温习一下AIO编程,AIO编程简单实例

完成端口(AIO)是Windows下开发多并发网络连接、异步服务器程序的最常用方案。JDK 1.7版本引入了AIO的相关封装。这里把之前写过的一个AIO例子发出来温习一下。为下一步分析JDK的AIO做一些准备工作。

下面的例子是AIO与线程池结合的例子,每个连接在建立之后即调用一次receive方法,这里的receive是不阻塞主线程的继续运行接受其他连接的。可以把这个调用想象成一个事件注册的过程,告诉内核对象,我关心这样的读取数据事件,当数据过来时,先把它收下来,放到之前用参数指定的内存缓冲区中,然后通知一下我就可以了。子线程就在等待数据接收完成的完成端口上面等待,直到数据接收完成,处理数据。让繁杂的数据接收拷贝过程交给内核对象去完成。使得线程管理和编程更加简单。

阅读全文 »

| 1 分2 分3 分4 分5 分 (4.80- 5票) Loading ... Loading ... | 同时归档在:C/C++, IO编程 |

SkyDrive、DropBox和Google Drive三大公有云存储服务对比

严格意义上说,iCloud相对较为封闭,不算是通用的云存储。上面三种云存储应用,笔者都有使用,就各自的优缺点说一下使用的感受。

SkyDrive还是同Windows绑定太紧密,客户端只支持在Windows Vista SP2以上版本上面安装,XP用户就只能通过网页手动同步,无法体验本地文件夹与网络文件夹的自动同步。自动同步功能还是非常有用的,如:在iPad上面的照片可以很快上传到网络上面,然后在PC上面查看。反之亦然。在自动同步上面做得最好的应该是DropBox,但是DropBox只有2G的免费空间,这个显得有点寒碜。同时DropBox几乎支持目前的所有操作系统。

GDrive在国外应该是很不错的应用,与GoogleDocs天然绑定,15G的共享空间,但是非常无赖,国内还要修改本地的hosts文件来访问,并且修改之后也不稳定。这里提供一个可用的hosts文件配置:

文件路径:C:\Windows\System32\Drivers\etc\hosts

在文件末尾加入如下内容:

173.194.38.128 drive.google.com
203.208.46.180 docs.google.com
203.208.46.180 0.docs.google.com
203.208.46.180 1.docs.google.com
203.208.46.180 2.docs.google.com
203.208.46.180 3.docs.google.com
203.208.46.180 4.docs.google.com
203.208.46.180 5.docs.google.com

再就是移动设备上面,不能支持多媒体文件的播放。而其他两种都可以支持本地播放器播放临时文件。

在快速分享存储内容上面,三者都大同小异。基于账户,基于隐秘链接,公开给所有人三种都有实现。

对于文件历史版本备份,三者都能保存一定时间的文件的历史版本,GoogleDrive和DropBox还带有回收站,误删文件可以从回收站中找回。

相信随着互联网业务发展的日新月异,用户的增多,空间、平台、收费与否都不是问题。阻碍信息流通的产品设计会越来越少。

| 1 分2 分3 分4 分5 分 (5.00- 5票) Loading ... Loading ... | 同时归档在:移动互联 |

华为终端最近挺热闹

酝酿了3个多月的华为Ascend P6终于在伦敦Roundhouse亮相,这一次在宣传和营销上可谓做足了功夫。昨晚失眠,索性就把发布会的视频翻出来过了一下。并没有微博和各个消费电子门户上面造势的那样惊艳,只能说是一部普通的手机罢了。牺牲了电池容量和本可以在去年就发布的时间点,换来了6.18mm的超薄厚度。K3V2始终是一个硬伤,这次发布会中没有强调P6是用的K3V2E。高通的骁龙系列都从4核心1.2GHZ发展到了枭龙800的4核心2GHZ+,覆盖了低中高端的所有需求。而华为的终端机型,无论处于哪个档次,一直使用K3V2,这样的做法让人看不出终端开始走向高端的趋势。

22257642_1371567595555_500

1.5GHZ 4核心CPU,720P HD 4.7英寸屏,2000mHa电池,前置500W像素、后置800W像素摄像头,2GRAM,从配置上面看不到任何“旗舰”的标志。这些配置都是去年的主流配置,在今年Q3相信各大厂商都会推出新的主流配置手机,这个配置会被甩到很远,而正是那时,P6才放量上市。加上细节问题百出的不争气Emotion UI,相比之下,恐怕消费者不会把P6放在首选的位置。余总承东1000万的销售量恐难以达到。

 

再来看一下,一直作为卖点的超薄、外观设计。不得不承认,P6的外观设计颠覆了之前的华为手机外观的印象。同事常笑谈,手机像情人,如果一个手机只是屏幕非常非常大,如美腿(Ascend Mate),只是厚度非常非常薄,如P6,就好象一个男人在夸她家的妹子胸大,只有胸大,相信没有人认为这是每个人都喜欢的美。外观设计的确比较出众,但是要想到这是一个“1000多人跨部门合作”的成果,这样外观必然是有一些标杆参照的,否则必然是一个各方妥协没有一致性的怪物。仔细看一下P6的外观,正面上方可以说是iPhone5的,下方是索尼一直坚持的双C倒角造型。金属外壳,可以看出为了打造旗舰,舍出了血本。2688的价格,如果真像发布会上面与S4和iPhone5对比的那样,那么也算是良心价了。这个价格应该是吸取了Ascend D2初期定价过高的教训,但是仍然过高了,相信不出一个月会有大幅的跳水。

 

总的来说,还是可以看到进步的,希望P6是一个终端的转折点,以P6为基础,将配置与主流机型拉齐打造出真正的旗舰。

| 1 分2 分3 分4 分5 分 (4.83- 6票) Loading ... Loading ... | 同时归档在:数码硬件 | 标签: , , |

发布一个改良后的轻量级下载工具

一直都觉得迅雷等工具太重了,即占用网络带宽又消耗系统资源。而且在下载源的出口速度普遍超过家庭宽带的速度时,p2p已经起不到下载提速的作用,甚至还会在下载完成后占用上传带宽。因此一直想找到一个最精简的下载工具,axel是目前发现的比较合适的。以后试着用脚本写一个类似的工具。

axel是linux下的多线程下载工具,工具支持多线程并发下载,支持断点续传。这里基于axel-2.4的源码,在cygwin下编译了Windows版本。基于gnu的开源license,发布一个Windows的版本。

编译好的软件包见文末的下载地址。

其中,mydownload.bat为启动程序,在使用之前只需要修改其中的目录即可:

@cd /d "C:\Users\t\Desktop"
@set maxcons=8

:renew
@set /p url=请输入下载路径:
@call D:\software\axel-2.4\axel.exe -n %maxcons% -a "%url%"
@echo finished!
@echo;
@echo;
@goto renew
@pause

axel.exe文件的路径和下载后文件存放的路径。即以上粉红色部分。

下载地址:http://codefine.site/wp-content/uploads/2013/06/axel-2.4.zip

| 1 分2 分3 分4 分5 分 (4.50- 6票) Loading ... Loading ... | 同时归档在:C/C++ |

通过/proc/stat文件信息,java实现计算cpu使用率

/proc/stat 文件内容:
[root@Shentar ~]# cat /proc/stat
cpu 602 0 2164 11445 2294 0 17 0 0
cpu0 306 0 1232 4553 2125 0 15 0 0
cpu1 295 0 932 6891 169 0 1 0 0
intr 7110 269 7 0 1 1 0 5 0 1 0 0 0 91 0 0 106 0 6521 0 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 38984
btime 1368275792
processes 2713
procs_running 1
procs_blocked 0
[root@Shentar ~]#

第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

参数 解析(单位:jiffies)

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)

user (38082) 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。

nice (627) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间

system (27594) 从系统启动开始累计到当前时刻,处于核心态的运行时间

idle (893908) 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)

irq (581) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)

softirq (895) 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)

结论:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest

计算时,采样两个时间点的数据,对于时间点1,记录总的cpu时间total1,记录空闲时间idle1,对于时间2,同样记录total2和idle2。

菜谱使用率为:cpuusage = 1 – (idle2 – idle1) / (total2 – total1)

注意,如果时间点1和时间点2间隔足够小(小于10ms),则可能出现total2 – total1为0,这样cpu使用率应该为0,而不是采用除法计算。

java代码如下:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 同时归档在:Java |

收藏一些配置

CPU Intel 酷睿i7 3770K(散) 1 ¥ 2000
主板 技嘉GA-B75-D3V(rev.1.1) 1 ¥ 769
内存 金士顿8GB DDR3 1600 1 ¥ 275
硬盘 希捷Barracuda XT 2TB 7200转 64MB SATA3(ST32000641AS) 1 ¥ 600
固态硬盘 三星SSD 840 Series SATA III(120GB) 1 ¥ 629
机箱 百盛C615 1 ¥ 118 ¥118 4家商家
电源 酷冷至尊战斧500(eXtreme Power Plus 500) 1 ¥ 359
散热器 超频三红海至尊版 1 ¥ 145
键鼠装 罗技MK330键鼠套装 1 ¥ 180
光驱 先锋DVR-XD11C 1 ¥ 349

20130308-212444.jpg

| 1 分2 分3 分4 分5 分 (4.67- 3票) Loading ... Loading ... | 同时归档在:数码硬件 |

Chrome 3月5号更新版本闪退

今天打开chrome浏览器后,提示有新版本可用。ios下的chrome不像pc版本更新得那么勤,看到有更新,迫不及待的点击了更新按钮。安装完成,却发现无法启动,确切的说是闪退。幸好还有safari,google了一下,发现遇到这个问题的还真不少。

Chrome闪退

有人提到是“下载插件”导致的,卸载了chrome download manager后,果然问题解决。appstore里大量的闪退不知道是不是也是这个原因导致的。

当初之所以将系统越狱也是因为需要安装这个插件,不能从浏览器下载文件这个没法忍受,而GOOGLE又不能发布一个越狱产品,相信这样个插件的市场很比较大,这是不是意味着chrome被一个小小的插件绑架了。不管闪退的原因是什么,这次chrome的损失应该是非常大的。当一个产品大规模用起来后,程序员真有一种如履薄冰的感觉。相信很快就有解决问题的新版本出来了。

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 同时归档在:移动互联 | 标签: , |
返回顶部