在Linux x86_64环境下编译memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
说简单一点memcached就是维护着一个位于内存中的大map。它利用RAM的随机访问优势(内存的读写速度要比磁盘的读写速度快得多,前者是后者的10的6次方倍),将某个对象通过特定的索引值存储,当需要这个对象的时候通过这个索引值可以立即找出来。索引值在整个内存缓冲系统中是唯一的,也同时对应唯一的一个对象。这样在涉及查询数据的操作时加入这样一种机制即可起到加快访问速度的效果。
闲话少叙,下面介绍memcached在Linux x86_64环境中的编译过程。
工作机器各项参数如下:
CPU:Intel Xeon 5110
内存:DDR2 1G*4
主机型号:ProLiant DL140 G3
操作系统:Red Hat Enterprise Linux Server release 5.4 x86_64版
内核版本:2.6.18
gcc版本:4.1.2
g++版本:4.1.2
1.下载memcached源码包
访问memcached官方网站http://memcached.org可以下载到最新最稳定版本的memcached源码包
下载完成后将其解压
- [root@lxp2 ~]# cd Download
- [root@lxp2 Download]# ll
- total 312
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
- [root@lxp2 Download]# tar -xf memcached-1.4.10.tar.gz
- [root@lxp2 Download]# ll
- total 316
- drwxr-xr-x 6 1000 1000 4096 Nov 10 08:32 memcached-1.4.10
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz

[root@lxp2 ~]# cd Download
[root@lxp2 Download]# ll
total 312
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
[root@lxp2 Download]# tar -xf memcached-1.4.10.tar.gz
[root@lxp2 Download]# ll
total 316
drwxr-xr-x 6 1000 1000 4096 Nov 10 08:32 memcached-1.4.10
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
2.尝试配置memcached编译
进入memcached解压后的目录后,执行./configure命令来检测当前系统环境并生成makefile
- [root@lxp2 Download]# cd memcached-1.4.10
- [root@lxp2 memcached-1.4.10]# ./configure

[root@lxp2 Download]# cd memcached-1.4.10
[root@lxp2 memcached-1.4.10]# ./configure
如果在执行之后发现最后一行有如下提示表明缺少libevent库:
- checking for libevent directory... configure: error: libevent is required. You can get it from http://www.monkey.org/~provos/libevent/
- If it's already installed, specify its path using --with-libevent=/dir/
- [root@lxp2 memcached-1.4.10]#

checking for libevent directory... configure: error: libevent is required. You can get it from http://www.monkey.org/~provos/libevent/ If it's already installed, specify its path using --with-libevent=/dir/ [root@lxp2 memcached-1.4.10]#
这是在编译memcached过程中经常遇到的问题(memcached基于libevent的事件处理机制。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使服务器的连接数增加,也能发挥时间复杂度O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。)。这时就要安装libevent库了。在libevent官方网站http://libevent.org中可以下载到最新最稳定版源代码:
同样需要解压并进入解压后的源码包目录:
- [root@lxp2 Download]# ll
- total 1140
- -rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
- drwxr-xr-x 6 1000 1000 4096 Nov 20 17:03 memcached-1.4.10
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
- [root@lxp2 Download]# tar -xf libevent-2.0.16-stable.tar.gz
- [root@lxp2 Download]# cd libevent-2.0.16-stable

[root@lxp2 Download]# ll
total 1140
-rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
drwxr-xr-x 6 1000 1000 4096 Nov 20 17:03 memcached-1.4.10
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
[root@lxp2 Download]# tar -xf libevent-2.0.16-stable.tar.gz
[root@lxp2 Download]# cd libevent-2.0.16-stable
接下来要配置libevent库的编译了。这里的配置需要注意添加--prefix参数,这个参数要指定编译完成后,如果安装此库,库安装到哪里。默认值是/usr/local。如果保持默认值,会将库安装到/usr/local/lib目录中。多数Linux发行版默认的加载库路径都不包含此路径。为了避免麻烦,这里指定--prefix=/usr。这样编译后安装就会安装到/usr/lib目录中了。这个目录是多数Linux发行版默认的加载库路径。
执行配置脚本:
- [root@lxp2 libevent-2.0.16-stable]# ./configure --prefix=/usr

[root@lxp2 libevent-2.0.16-stable]# ./configure --prefix=/usr
如果你在配置时忘了加这个参数,不要紧,后面还有解决办法,接着往下看。
配置好之后就可以编译了:
- [root@lxp2 libevent-2.0.16-stable]# make

[root@lxp2 libevent-2.0.16-stable]# make
编译好之后就是用root权限安装:
- [root@lxp2 libevent-2.0.16-stable]# sudo make install

[root@lxp2 libevent-2.0.16-stable]# sudo make install
3.正式编译memcached
刚刚介绍的是遇到了一个小麻烦时的解决办法,现在已经不存在libevent库缺失的问题了,如果你遇到了libevent库缺失的问题,此时需要回到memcached源码包目录,再次执行一次编译配置脚本:
- [root@lxp2 memcached-1.4.10]# ./configure

[root@lxp2 memcached-1.4.10]# ./configure
不添加参数直接执行编译配置脚本,在安装时将自动安装到/usr/local/bin目录中。如果要更改安装位置,可以添加参数--prefix。例如--prefix=/usr/local/memcached,则安装时将安装到/usr/local/memcached/bin中。
检查没问题,可以开始编译了:
- [root@lxp2 memcached-1.4.10]# make

[root@lxp2 memcached-1.4.10]# make
编译完成后进行安装
- [root@lxp2 memcached-1.4.10]# sudo make install

[root@lxp2 memcached-1.4.10]# sudo make install
然后去看一看是否已经安装(memcached默认安装目录为/usr/local/bin)。转到memcached目录,然后启动memcached加参数-h显示帮助。帮助第一行即当前memcached版本:
- [root@lxp2 memcached-1.4.10]# cd /usr/local/bin/
- [root@lxp2 bin]# sudo ./memcached -h
- ./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
- [root@lxp2 bin]#

[root@lxp2 memcached-1.4.10]# cd /usr/local/bin/
[root@lxp2 bin]# sudo ./memcached -h
./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
[root@lxp2 bin]#
如果之前的libevent编译时加了--prefix=/usr参数,此时执行应该是正常的,会显示帮助信息。我刚才编译libevent库的时候故意没有加此参数,因此memcached到这一步的时候就会出现上面的问题——无法加载共享库libevent-2.0.so.5。如果你也遇到了这样的问题,接着往下看:
在多数linux发行版中,程序启动后静态加载的库默认查找路径为/lib(64位系统还有/lib64)和/usr/lib(64位系统中还有/usr/lib64),而目前我们编译的libevent库安装路径不在这些默认库加载路径中,因此需要配置库加载路径:
先通过ldd命令看一看memcached都需要加载哪些库:
- [root@lxp2 bin]# ldd memcached
- libevent-2.0.so.5 => not found
- librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
- libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
- libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
- /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
- [root@lxp2 bin]#

[root@lxp2 bin]# ldd memcached
libevent-2.0.so.5 => not found
librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
[root@lxp2 bin]#
此时看到结果第一行:libevent-2.0.so.5 => not found,正是缺少的库,该库无法找到。
那这个库在哪里呢?我们来问一下系统:
- [root@lxp2 bin]# whereis libevent-2.0.so.5
- libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
- [root@lxp2 bin]#

[root@lxp2 bin]# whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
[root@lxp2 bin]#
它告诉我们,libevent-2.0.so.5库存放在/usr/local/lib目录中。因此我们把这个目录加入到系统默认的库加载路径中。这里要修改系统环境变量$LD_LIBRARY_PATH。
先看一下当前$LD_LIBRARY_PATH的值:
- [root@lxp2 bin]# echo $LD_LIBRARY_PATH
- [root@lxp2 bin]#

[root@lxp2 bin]# echo $LD_LIBRARY_PATH [root@lxp2 bin]#
当前值为空,说明目前库加载路径还是上文提到的/lib(64位系统还有/lib64)和/usr/lib(64位系统中还有/usr/lib64)。接下来使用root权限修改/etc/profile文件,在文件末尾追加一行:
- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
然后保存,更新一下系统配置:
- [root@lxp2 bin]# source /etc/profile

[root@lxp2 bin]# source /etc/profile
再查看一下默认加载库路径:
- [root@lxp2 ~]# cd /etc/
- [root@lxp2 etc]# source profile
- [root@lxp2 etc]# echo $LD_LIBRARY_PATH
- /usr/local/lib:
- [root@lxp2 etc]#

[root@lxp2 ~]# cd /etc/
[root@lxp2 etc]# source profile
[root@lxp2 etc]# echo $LD_LIBRARY_PATH
/usr/local/lib:
[root@lxp2 etc]#
libevent库所在的目录已经添到了系统默认库加载路径中了,再次使用ldd命令查看memcached是否能够完全加载所需的库:
- [root@lxp2 etc]# cd /usr/local/bin/
- [root@lxp2 bin]# ls
- dialyzer erl escript memcached run_test typer
- epmd erlc event_rpcgen.py run_erl to_erl
- [root@lxp2 bin]# ldd memcached
- libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
- librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
- libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
- libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
- /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
- [root@lxp2 bin]#

[root@lxp2 etc]# cd /usr/local/bin/
[root@lxp2 bin]# ls
dialyzer erl escript memcached run_test typer
epmd erlc event_rpcgen.py run_erl to_erl
[root@lxp2 bin]# ldd memcached
libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
[root@lxp2 bin]#
已经都能找到了,看一下版本信息:
- [root@lxp2 bin]# ./memcached -h
- memcached 1.4.10
- -p <num> TCP port number to listen on (default: 11211)
- -U <num> UDP port number to listen on (default: 11211, 0 is off)

[root@lxp2 bin]# ./memcached -h
memcached 1.4.10
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 11211, 0 is off)
已经没有问题了。
至此memcached的编译安装完成。
近期我还要写一些关于memcached的配置文章,敬请关注!
参考资料:
在CentOS 5.6上编译安装Memcached ,http://whxhz.iteye.com/blog/1117118
error while loading shared libraries: libevent-2.0.so.5解决办法,http://blog.sina.com.cn/s/blog_6d09b5750100vqow.html
在Linux x86_64环境下编译memcached的更多相关文章
- linux 极限环境下编译环境的安装
前文:通常情况下在linux系统中安装一个软件包或者是服务有几种方式. 最简单的一种是在可以连接外网的情况下,配置好网络yum源,需要什么包就配置什么yum然后一路yum install 软件包名即可 ...
- Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7环境下搭建好Lnmp环境之后,发现安装的php有好多扩展都没有安 ...
- 05 linux下编译Memcached
一: linux下编译Memcached(1)先在linux上安装gcc,cmake,autoconf,libtool工具,以后会使用到. 安装命令为:yum install gcc make aut ...
- Redhat环境下编译安装Google Bazel
Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...
- 在SoCEDS环境下编译和更新preloader和uboot程序的方法
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
- Android 环境下编译FFmpeg
Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1. X2 ...
- Linux centos7环境下安装Nginx
Linux centos7环境下安装Nginx的步骤详解 1. 首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...
- JNI各种环境下编译方法及初期出错分析
转自 https://www.cnblogs.com/xyang0917/p/4172490.html 第五步.将C/C++代码编译成本地动态库文件 动态库文件名命名规则:lib+动态库文件名+后缀( ...
- centos / Linux 服务环境下安装 Redis 5.0.3
原文:centos / Linux 服务环境下安装 Redis 5.0.3 1.首先进入你要安装的目录 cd /usr/local 2.下载目前最新稳定版本 Redis 5.0.3 wget http ...
随机推荐
- C++空类大小
class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类 ...
- QtCreator开启-O编译优化的方式
首先,编译优化必须是在Release模式下进行,保证程序没有任何bug的条件下进行执行.编译优化能极大提升程序的运行效率,级别越高速度越快,但是对代码健壮性要求也越高! 选择编译release模式,在 ...
- Spring线程池由浅入深的3个示例
作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然,所以并未做过多的解释.诸位一看便知. 前提条件: 1)在Ec ...
- mybatis 学习二 MyBatis简介与配置MyBatis+Spring+MySql
1.2.2建立MySql数据库 在C:\Program Files\MySQL\MySQL Server 5.7\bin下面: 首先连接MySQL: mysql -u root -p ...
- 如何在C#中读写INI文件
INI文件就是扩展名为"ini"的文件.在Windows系统中,INI文件是很多,最重要的就是"System.ini"."System32.ini&q ...
- RPC: program not registered (ZT)
When we trying to use a particular RPC program, below may indicate that rpcbind is not running or t ...
- CSS——display
display的主要属性: 1.none: 不显示: 不保留其在页面中的位置,即相当于html文档中没有这个元素: visible:hidden虽然也不显示:但依然保存着他的位置和大小. 2.bloc ...
- PHP通过加锁实现并发情况下抢码功能
本文基于php语言使用加锁实现并发情况下抢码功能,特定时间段开放抢码并不允许开放的码重复: 需求:抢码功能 要求: 1.特定时间段才开放抢码: 2.每个时间段放开的码是有限的: 3.每个码不允许重复: ...
- PLSQL语法
Procedural Language和SQL的结合体.通过增加变量.控制语句,使我们可以写些逻辑更加复杂的数据库操作 语句框架组成 declare – 可选 声明各种变量或游标的地方. begin ...
- koa的教程
https://github.com/bmcmahen/koa-mongo-sessionhttp://www.fkwebs.com/2333.htmlhttps://segmentfault.com ...