灌溉梦想,记录脚步

在64位Linux上安装MemCached

在一台64位Linux的机器上安装了MemCached,遇到一个小问题,特记录之。

MemCached使用了libevent,所以必须先安装libevent。安装libevent到/usr/lib

wget http://www.monkey.org/~provos/libevent-1.4.9-stable.tar.gz
gzip -d libevent-1.4.9-stable.tar.gz
tar xvf libevent-1.4.9-stable.tar
cd libevent-1.4.9-stable
./configure --prefix=/usr
make
make install

安装MemCached的到/u01/memcached

wget http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz
gzip -d memcached-1.2.6.tar.gz
tar xvf memcached-1.2.6.tar
cd memcached-1.2.6
./configure --prefix=/u01/memcached --with-libevent=/usr
make
make install

但是执行memcached命令时出现错误:

#/u01/memcached/bin/memcached -h
/u01/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2:
cannot open shared object file: No such file or directory


一般对于这种依赖的库找不到的情况,在Linux中可以通过设置LD_DEBUG环境变量来获得更多的信息
#LD_DEBUG=help ls
Valid options for the LD_DEBUG environment variable are:

  libs        display library search paths
  reloc       display relocation processing
  files       display progress for input file
  symbols     display symbol table processing
  bindings    display information about symbol binding
  versions    display version dependencies
  all         all previous options combined
  statistics  display relocation statistics
  unused      determined unused DSOs
  help        display this help message and exit

To direct the debugging output into a file instead of standard output
a filename can be specified using the LD_DEBUG_OUTPUT environment variable.

这里由于是库文件依赖有问题,则使用libs参数:

#LD_DEBUG=libs /u01/memcached/bin/memcached -h
     30596:     find library=libevent-1.4.so.2 [0]; searching
     30596:      search cache=/etc/ld.so.cache
     30596:      search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64
/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64
(system search path)
     30596:       trying file=/lib64/tls/x86_64/libevent-1.4.so.2
     30596:       trying file=/lib64/tls/libevent-1.4.so.2
     30596:       trying file=/lib64/x86_64/libevent-1.4.so.2
     30596:       trying file=/lib64/libevent-1.4.so.2
     30596:       trying file=/usr/lib64/tls/x86_64/libevent-1.4.so.2
     30596:       trying file=/usr/lib64/tls/libevent-1.4.so.2
     30596:       trying file=/usr/lib64/x86_64/libevent-1.4.so.2
     30596:       trying file=/usr/lib64/libevent-1.4.so.2
     30596:
/u01/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2:
cannot open shared object file: No such file or directory

可以看到是在加载/usr/lib64/libevent-1.4.so.2文件时出现了问题,系统中确实是没有该文件的,查找后发现libevent-1.4.so.2存在于/usr/lib目录,这可能是libevent在64位Linux系统上的一个bug吧,没有关系,复制一份或者建一个软链接即可解决问题。

#ln -s /usr/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
#/u01/memcached/bin/memcached -h
memcached 1.2.6
-p
      TCP port number to listen on (default: 11211)
-U
      UDP port number to listen on (default: 0, off)
-s
     unix socket path to listen on (disables network support)
-a
     access mask for unix socket, in octal (default 0700)
-l
  interface to listen on, default is INDRR_ANY
-d            run as a daemon
-r            maximize core file limit
-u
 assume identity of
 (only when run as root)
-m
      max memory to use for items in megabytes, default is 64 MB
-M            return error on memory exhausted (rather than removing items)
-c
      max simultaneous connections, default is 1024
-k            lock down all paged memory.  Note that there is a
              limit on how much memory you may lock.  Trying to
              allocate more than that would fail, so be sure you
              set the limit correctly for the user you started
              the daemon with (not for -u
 user;
              under sh this is done with 'ulimit -S -l NUM_KB').
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-h            print this help and exit
-i            print memcached and libevent license
-b            run a managed instanced (mnemonic: buckets)
-P
     save PID in
, only used with -d option
-f
   chunk size growth factor, default 1.25
-n
    minimum space allocated for key+value+flags, default 48

启动MemCached,-m表示分配的内存

#/u01/memcached/bin/memcached -d -m 1024 -u admin -l 127.0.0.1 -p 11211

memcached

memcached是一套分散式的快取系统,当初是Danga Interactive为了LiveJournal所发展的,但目前被许多软体(如MediaWiki)所使用。这是一套开放原始码软体,以BSD license授权释出。

memcached缺乏认证以及安全管制,这代表应该将memcached伺服器放置在防火墙后。

memcached的API使用三十二位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的资料库)需要额外的程式码更新memcached内的资料。

使用单位

Digg
Facebook(同时也回馈了许多程式码)
Meetup.com(提供memcached对Java的连线函式库)
Slashdot
Wikipedia

范例

将纯粹使用资料库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:

function get_foo (int userid) {
result = db_select(“Select * FROM users Where userid = ?”, userid);
return result;
}

加上memcached的快取机制后:

function get_foo (int userid) {
result = memcached_fetch(“userrow:” + userid);
if (!result) {
result = db_select(“Select * FROM users Where userid = ?”, userid);
memcached_add(“userrow:” + userid, result);
}
return result;
}

上述的程式会先到memcached检查是否有userrow:userid的资料,如果有则直接传回结果,如果不存在时再去资料库查询,并将结果放到memcached内。

在memcached内已经有快取资讯时将资料库的资料更新后,上述的程式会抓到旧的资料,这是属于Cache coherency的问题。其中一种解决的方法是在更新资料库时,同时更新memcached内的资讯:


function update_foo(int userid, string dbUpdateString) {
result = db_execute(dbUpdateString);
if (result) {
data = createUserDataFromDBString(dbUpdateString);
memcached_set(“userrow:”+userid, data);
}
}

关闭访问https站点时烦人的信息安全提示

忘了从什么时候开始,用ie打开或刷新https站点时,比如google docs,总会弹出一个“安全警告”的提示框:

是否只查看安全传送的网页内容?
此网页包含的内容将不使用安全的HTTPS连接传送,可能危及到整个网页的安全。

一开始习惯性的选择了“是”,但是发现IE左下角那里马上会提示“网页上有错误”,只能选择“否”才可以正常Google Docs的功能,比如右键菜单,虽然使用没有问题了,但是每次都弹出这个“安全警告”,而且还要点击确认,实在很烦,试了一下,发现自定义一下IE安全设置可以屏蔽掉这个烦人的提示:

工具 > Internet选项 > 安全 > Internet > 自定义级别 > 其它 > 显示混合内容 = 启用

当然了,不知道这样做有没有什么安全隐患,不过不管了,总比每次都要点击确认好很多!

Linux的启动过程

  1. 系统启动时,首先由固化在硬件中的 BIOS 对硬件进行初始化,然后读取硬盘的 MBR 上的引导程序。
    BIOS: Basic Input/Ouput System,基本输入输出系统,固化在系统中的代码,用于完成最底层的硬件操作。
    MBR: Master Boot Record,主引导记录,位于第一块硬盘的第一个扇区,大小为512字节。其中前 446 字节为引导程序,之后的 64 字节为分区表,最后的两字节为结束标记。
  2. MBR 中的 stage1 执行,并跳转到硬盘上保存的引导程序的剩余部分(即stage2)。
    stage1stage2: MBR 中保存的为 Linux 引导程序( Linux Boot Loader) 的第一部分(即stage1)。由于一般的引导程序都很大,无法放到 MBR 的 446 字节中,因此只将一部分放到 MBR 中,这一部分称为 stage1,用于将引导程序的剩余部分(即stage2)读入并执行。
  3. stage2 执行,并读取 Linux 内核。
  4. 内核执行,对各种硬件进行检测和初始化。
  5. 内核启动 init 进程。
    init进程: 为 Linux 系统中启动的第一个进程,PID 为 1,其它所有的进程都为该进程的子进程。
  6. init 进程按照 /etc/inittab 的指示进行系统初始化工作。一般包括启动各种服务,并启动数个虚拟终端供用户登录。

init配置文件说明

Linux 内核启动之后,启动的第一个进程就是 init 进程。该进程从 /etc/inittab 文件中读取配置,对系统进行一系列的初始化工作。下面我们来分析一下 /etc/inittab 文件的结构。

inittab 文件的每一行的基本格式如下所示:

l3:3:wait:/etc/rc.d/rc 3

可以看到,该行使用冒号分成了四段。各段的意思如下。

  1. ID
    用于标识该配置项的 id,长度为 1~4 个字符。
  2. 运行级
    列出在哪些运行级时执行该配置项的命令。本例表明使用运行级 3 启动系统时执行该条指令。
  3. 动作
    指示该条命令应该如何执行。本例中动作为 wait,表示在这条命令未执行完之前不要去执行下一条命令。
  4. 进程
    执行该项时需要启动的可执行文件名及其参数。

常见的动作如下所示。

  • initdefault: 该配置项指定系统的默认运行级。
  • respawn: 该配置项所指定的进程如果被结束,则重新启动该进程。
  • wait: 该配置项指定的进程在运行结束之前不要执行下一条配置项。
  • once: 切换到对应的运行级之后,仅执行指定的进程一次。
  • sysinit: 无论以什么运行级启动,系统启动时都要执行该配置项指定的进程。
  • boot: 仅在系统启动时执行一次。
  • bootwait: 仅在系统启动时执行一次,在执行结束之前不执行下一条配置项
  • powerfail: 当接收到UPS的断电通知时执行该项指定的进程。
  • powerwait: 与powerfail相同,但init会等待进程执行结束。
  • powerokwait: 接收到UPS的供电通知时执行。
  • ctrlaltdel: 当用户同时按下 Ctrl+Alt+Del 时执行该项指定的进程。

下面我们看看实际的例子。这是 Fedore Core 3 的 /etc/inittab 文件。删掉了其中的一些注释,并适当地对每一行增加了解释。

# 下面用 initdefault 动作设置默认的运行级。注意该项没有指定进程,
# 但是最后的分号不要漏掉
#   0 - 关机 (不要将此运行级设为默认)
#   1 - 单用户模式
#   2 - 多用户,不支持 NFS。若无网络则与 3 相同
#   3 - 完整的多用户模式
#   4 - 未使用
#   5 - X11图形界面
#   6 - 重新启动 (不要将此运行级设为默认)
#
id:5:initdefault:

# 系统初始化,包括主机名设置、激活交换分区、检查根分区、
# 以读写方式加载根分区、加载 /etc/fstab 中的分区、
# 激活磁盘配额、加载内核模块等功能
si::sysinit:/etc/rc.d/rc.sysinit

# 执行 rc 脚本,启动各种系统服务
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# 接管 CTRL-ALT-Delete,按下时重新启动系统
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# 当 UPS 发来断电通知时,准备在 2 分钟之后关闭系统
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# 如果在关闭系统之前 UPS 恢复供电,则取消关闭系统
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# 在标准运行级时启动虚拟终端。这里准备了六个虚拟终端,
# 要想改变虚拟终端的数目,只需要增删这里的配置项即可
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# 运行级 5 的时候启动 X 的登录管理器
x:5:respawn:/etc/X11/prefdm -nodaemon

压力测试初探之工具选用和数据分析

★工具:

—> 采用的压力工具是loadrunner

loadrunner 的用法顺便提俩句:

大体分为俩步:1.生成脚本,2.用脚本测试;

web测试脚本可以直接用这个

web_url(“www.xxxx.com“,
“URL=www.xxxx.com”,
“Resource=0”,
“RecContentType=text/html”,
“Referer=”,
“Snapshot=t1.inf”,
“Mode=HTML”,
LAST);

—> 分用户组进行测试

你可以将100人分为3组,第一组测试首页,第二组测试列表页,第三组测试详情页;

操作: controler 里增加分组,分别设置测试脚本

★数据分析:

现在说下在linux下怎么察看数据

1.用top察看系统运行信息:

察看此选项:

load average: 8.83, 7.90, 7.69

这个就是服务器的负载均值,单颗cpu的正常数值为2,则俩颗的话就是4所以就可以得出(cpu数量可以在top命令下按1)

你得程序代码是需要优化还是优异;

2.用ps -afx | grep httpd 找到你所要找的web服务器安装信息;

在http.conf 里找到access日志的所在位置

用 tail -f /filepath 去查看前端程序的header信息.

3.有mysql日志的可以去查看mysql 日志如果没有建立mysql日志的话,就可以用

mysql > show full processlist;

获得所有的sql运行信息,如果某条sql运行时间过长,如1s,则会显示,说明你的这条sql该优化 了

大体过程就是 压力测试->发现压力负载->分析数据->优化代码->压力测试

Mysql 导入数据库乱码解决方法

在转移主机的时候经常公遇到mysql导入数据库乱码的问题

为了避免字符编码的问题,文件,数据库都是用UTF8来搞定。 在数据量小的时候phpmyadmin导入数据还是比较稳定的,数据量大了,就不行了。 于是用mysql 的source来搞定。

但是出现了一点小问题,导入的数据全是乱码。 查看了数据库和数据表的字符集设定,都是utf8,没有问题。看来是在命令行导入时对字符集的辨认出现了问题。

解决方法很简单:在执行source …. (导入)之前先执行 set names utf8; 即可。

例:

mysql> set names utf8;

mysql> d:/localhost.sql