在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源码包

下载完成后将其解压

[plain] view plain copy print?

  1. [[email protected] ~]# cd Download
  2. [[email protected] Download]# ll
  3. total 312
  4. -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
  5. [[email protected] Download]# tar -xf memcached-1.4.10.tar.gz
  6. [[email protected] Download]# ll
  7. total 316
  8. drwxr-xr-x 6 1000 1000   4096 Nov 10 08:32 memcached-1.4.10
  9. -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz

[[email protected] ~]# cd Download
[[email protected] Download]# ll
total 312
-rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
[[email protected] Download]# tar -xf memcached-1.4.10.tar.gz
[[email protected] 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

[plain] view plain copy print?

  1. [[email protected] Download]# cd memcached-1.4.10
  2. [[email protected] memcached-1.4.10]# ./configure

[[email protected] Download]# cd memcached-1.4.10
[[email protected] memcached-1.4.10]# ./configure 

如果在执行之后发现最后一行有如下提示表明缺少libevent库:

[plain] view plain copy print?

  1. checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/
  2. If it‘s already installed, specify its path using --with-libevent=/dir/
  3. [[email protected] 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/

[[email protected] memcached-1.4.10]# 

这是在编译memcached过程中经常遇到的问题(memcached基于libevent的事件处理机制。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使服务器的连接数增加,也能发挥时间复杂度O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。)。这时就要安装libevent库了。在libevent官方网站http://libevent.org中可以下载到最新最稳定版源代码:

同样需要解压并进入解压后的源码包目录:

[plain] view plain copy print?

  1. [[email protected] Download]# ll
  2. total 1140
  3. -rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
  4. drwxr-xr-x 6 1000 1000   4096 Nov 20 17:03 memcached-1.4.10
  5. -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
  6. [[email protected] Download]# tar -xf libevent-2.0.16-stable.tar.gz
  7. [[email protected] Download]# cd libevent-2.0.16-stable

[[email protected] 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
[[email protected] Download]# tar -xf libevent-2.0.16-stable.tar.gz
[[email protected] Download]# cd libevent-2.0.16-stable

接下来要配置libevent库的编译了。这里的配置需要注意添加--prefix参数,这个参数要指定编译完成后,如果安装此库,库安装到哪里。默认值是/usr/local。如果保持默认值,会将库安装到/usr/local/lib目录中。多数Linux发行版默认的加载库路径都不包含此路径。为了避免麻烦,这里指定--prefix=/usr。这样编译后安装就会安装到/usr/lib目录中了。这个目录是多数Linux发行版默认的加载库路径。

执行配置脚本:

[plain] view plain copy print?

  1. [[email protected] libevent-2.0.16-stable]# ./configure --prefix=/usr

[[email protected] libevent-2.0.16-stable]# ./configure --prefix=/usr

如果你在配置时忘了加这个参数,不要紧,后面还有解决办法,接着往下看。

配置好之后就可以编译了:

[plain] view plain copy print?

  1. [[email protected] libevent-2.0.16-stable]# make

[[email protected] libevent-2.0.16-stable]# make

编译好之后就是用root权限安装:

[plain] view plain copy print?

  1. [[email protected] libevent-2.0.16-stable]# sudo make install

[[email protected] libevent-2.0.16-stable]# sudo make install

3.正式编译memcached

刚刚介绍的是遇到了一个小麻烦时的解决办法,现在已经不存在libevent库缺失的问题了,如果你遇到了libevent库缺失的问题,此时需要回到memcached源码包目录,再次执行一次编译配置脚本:

[plain] view plain copy print?

  1. [[email protected] memcached-1.4.10]# ./configure

[[email protected] memcached-1.4.10]# ./configure

不添加参数直接执行编译配置脚本,在安装时将自动安装到/usr/local/bin目录中。如果要更改安装位置,可以添加参数--prefix。例如--prefix=/usr/local/memcached,则安装时将安装到/usr/local/memcached/bin中。

检查没问题,可以开始编译了:

[plain] view plain copy print?

  1. [[email protected] memcached-1.4.10]# make

[[email protected] memcached-1.4.10]# make

编译完成后进行安装

[plain] view plain copy print?

  1. [[email protected] memcached-1.4.10]# sudo make install

[[email protected] memcached-1.4.10]# sudo make install

然后去看一看是否已经安装(memcached默认安装目录为/usr/local/bin)。转到memcached目录,然后启动memcached加参数-h显示帮助。帮助第一行即当前memcached版本:

[plain] view plain copy print?

  1. [[email protected] memcached-1.4.10]# cd /usr/local/bin/
  2. [[email protected] bin]# sudo ./memcached -h
  3. ./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
  4. [[email protected] bin]#

[[email protected] memcached-1.4.10]# cd /usr/local/bin/
[[email protected] 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
[[email protected] bin]# 

如果之前的libevent编译时加了--prefix=/usr参数,此时执行应该是正常的,会显示帮助信息。我刚才编译libevent库的时候故意没有加此参数,因此memcached到这一步的时候就会出现上面的问题——无法加载共享库libevent-2.0.so.5。如果你也遇到了这样的问题,接着往下看:

在多数linux发行版中,程序启动后静态加载的库默认查找路径为/lib(64位系统还有/lib64)和/usr/lib(64位系统中还有/usr/lib64),而目前我们编译的libevent库安装路径不在这些默认库加载路径中,因此需要配置库加载路径:

先通过ldd命令看一看memcached都需要加载哪些库:

[plain] view plain copy print?

  1. [[email protected] bin]# ldd memcached
  2. libevent-2.0.so.5 => not found
  3. librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
  4. libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
  5. libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
  6. /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
  7. [[email protected] bin]#

[[email protected] 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)
[[email protected] bin]# 

此时看到结果第一行:libevent-2.0.so.5 => not found,正是缺少的库,该库无法找到。

那这个库在哪里呢?我们来问一下系统:

[plain] view plain copy print?

  1. [[email protected] bin]# whereis libevent-2.0.so.5
  2. libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
  3. [[email protected] bin]#

[[email protected] bin]# whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
[[email protected] bin]# 

它告诉我们,libevent-2.0.so.5库存放在/usr/local/lib目录中。因此我们把这个目录加入到系统默认的库加载路径中。这里要修改系统环境变量$LD_LIBRARY_PATH。

先看一下当前$LD_LIBRARY_PATH的值:

[plain] view plain copy print?

  1. [[email protected] bin]# echo $LD_LIBRARY_PATH
  2. [[email protected] bin]#

[[email protected] bin]# echo $LD_LIBRARY_PATH

[[email protected] bin]# 

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

[plain] view plain copy print?

  1. export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

然后保存,更新一下系统配置:

[plain] view plain copy print?

  1. [[email protected] bin]# source /etc/profile

[[email protected] bin]# source /etc/profile

再查看一下默认加载库路径:

[plain] view plain copy print?

  1. [[email protected] ~]# cd /etc/
  2. [[email protected] etc]# source profile
  3. [[email protected] etc]# echo $LD_LIBRARY_PATH
  4. /usr/local/lib:
  5. [[email protected] etc]#

[[email protected] ~]# cd /etc/
[[email protected] etc]# source profile
[[email protected] etc]# echo $LD_LIBRARY_PATH
/usr/local/lib:
[[email protected] etc]# 

libevent库所在的目录已经添到了系统默认库加载路径中了,再次使用ldd命令查看memcached是否能够完全加载所需的库:

[plain] view plain copy print?

  1. [[email protected] etc]# cd /usr/local/bin/
  2. [[email protected] bin]# ls
  3. dialyzer  erl   escript          memcached  run_test  typer
  4. epmd      erlc  event_rpcgen.py  run_erl    to_erl
  5. [[email protected] bin]# ldd memcached
  6. libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
  7. librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
  8. libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
  9. libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
  10. /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
  11. [[email protected] bin]#

[[email protected] etc]# cd /usr/local/bin/
[[email protected] bin]# ls
dialyzer  erl   escript          memcached  run_test  typer
epmd      erlc  event_rpcgen.py  run_erl    to_erl
[[email protected] 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)
[[email protected] bin]# 

已经都能找到了,看一下版本信息:

[plain] view plain copy print?

  1. [[email protected] bin]# ./memcached -h
  2. memcached 1.4.10
  3. -p <num>      TCP port number to listen on (default: 11211)
  4. -U <num>      UDP port number to listen on (default: 11211, 0 is off)

[[email protected] 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

时间: 2024-12-24 00:02:23

在Linux x86_64环境下编译memcached的相关文章

在虚拟机linux环境下编译windows版adb fastboot

原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android源码完整 虚拟机磁盘空间100G左右(60G用来存放代码和编译后的文件) swap 30G左右,若太小会导致在编译后提示缺失文件 [具体步骤] 理论上,只要下一个windows版本的SDK,里面就自带了fastboot和adb工具. 但我最近确实遇到了一个需要在linux下编译出windows版本的

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

05 linux下编译Memcached

一: linux下编译Memcached(1)先在linux上安装gcc,make,autoconf,libtool工具,以后会使用到. 安装命令为:yum install gcc make autoconf libtool 回车 备注:如果不能安装可能是权限问题,那么就全换到超级管理员的权限就行安装. 输入su 在输入你的注册时候的密码.(2)下载memcached源码和libevent库 下载地址:memcached.org libevent.org

Windows Azure+Windows+Linux多环境下Tomcat服务的安装及配置集合

Windows Azure+Windows+Linux多环境下的Tomcat服务的安装及配置集合 说到Tomcat服务,相信大家都很熟悉了,当然也这包括安装及配置:我们都知道Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求.实际上To

在SoCEDS环境下编译和更新preloader和uboot程序的方法

在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloader和uboot程序!以及如何去更新BOOT SD卡中的preloader和uboot! 从Terasic网站下下载的SD image是在13.1环境下编译出来的preloader和u-boot,这里会在14.0环境下重新编译并更新到SD卡中!并在inux系统下更新preloader和u-boot到SD卡

linux centos环境下,perl使用DBD::Oracle遇到报错Can&#39;t locate DBDOracle.pm in @INC 的解决办法

前言 接手前辈的项目,没有接触.安装.使用过perl和DBD::Oracle,也没有相关的文档记录,茫茫然不知所措~~.一开始发现这个问题,就想着迅速解决,就直接在google上搜报错信息,搜索的过程中发现 如果不搞清楚前因后果我连解决方案都'看不见''看不懂'. 所以还是要补充这方面的知识,再思考解决方案.以下内容就是我一边学习一边解决问题的过程,如果不足,请各位大佬指出. 报错 install_driver(Oracle) failed: Can't locate DBD/Oracle.pm

centos / Linux 服务环境下安装 Redis 5.0.3

原文:centos / Linux 服务环境下安装 Redis 5.0.3 1.首先进入你要安装的目录 cd /usr/local 2.下载目前最新稳定版本 Redis 5.0.3 wget http://download.redis.io/releases/redis-5.0.3.tar.gz 3.解压到当前目录 tar -xvzf redis-5.0.3.tar.gz 4.删除压缩包 rm redis-5.0.3.tar.gz 5.进入解压出来的目录 cd redis-5.0.3 6.编译源

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

如何在Linux桌面环境下自动启动程序?

转自:http://os.51cto.com/art/201401/426464.htm 有时候,当你登录进入到Linux桌面后,可能想自动启动某个程序.这类启动程序在你登录进入到桌面后,可以进行面向整个系统的配置(比如自动代理),或者针对特定用户的桌面定制(比如Conky). 大多数Linux桌面环境有各自的图形用户界面(GUI),让用户可以配置针对特定用户的自动启动程序或服务. 我在本教程中将介绍如何在各种Linux桌面环境下,自动启动某个程序. GNOME桌面环境 在终端中运行这个命令,启