centos源码安装多线程memcached multi-threaded

  唉,本来好好的使用的memcached的,突然要修改成支持多线程。对于memcached默认是只使用一个线程的,也就是说所有的请求都是通过一个线程来响应请求。如果想使memcached支持多线程,那么你就必须重新编译memcached。在编译memcached的时候,使用--enable-threads选项来告诉memcached来支持多线程。然后编译安装完成之后,memcached就可以支持多线程响应请求。

  需要注意的是如果你在启动的是没有通过-t选项指定thread的个数,那么memcached默认是四个线程。另外如果你指定的线程树超过了你cpu的核数,则有可能引发死锁问题,而且必须你的机器支持多线程编程(这句话不是很理解,是翻译过来的。现在机器不都是支持的吗)。


首先贴上安装的代码步骤,然后对出现问题简单分析一下。

下面的安装步骤是分为两个部分,一种是直接通过yum安装工具进行安装。这种方式是安装的单线程的memcached,如果想支持多线程,那么就必须采用第二种即通过编译源码进行安装。通过源码编译安装的话,必须是要机器上安装有libevent包,否则也是无法正常编译完成的。

1:Installing memcached from a Binary Distribution

To install memcached on a Red Hat, or Fedora host, use yum:

root-shell> yum install memcached
Note

On CentOS, you may be able to obtain a suitable RPM from another source, or use the source tarball.

To install memcached on a Debian or Ubuntu host, use apt-get:

root-shell> apt-get install memcached

To install memcached on a Gentoo host, use emerge:

root-shell> emerge install memcached


2:Building memcached from Source

On other Unix-based platforms, including Solaris, AIX, HP-UX and Mac OS X, and Linux distributions not mentioned already, you must install from source. For Linux, make sure you have a 2.6-based kernel, which includes the improved epoll interface. For all platforms, ensure that you have libevent 1.1 or higher installed. You can obtain libevent from libevent web page.

You can obtain the source for memcached from memcached Web site.

To build memcached, follow these steps:

  1. Extract the memcached source package:

    shell> gunzip -c memcached-1.2.5.tar.gz | tar xf - 
    
  2. Change to the memcached-1.2.5 directory:

    shell> cd memcached-1.2.5
    
  3. Run configure

    shell> ./configure
    

    Some additional options you might specify to the configure:

    • --prefix

      To specify a different installation directory, use the --prefix option:

      shell> ./configure --prefix=/opt
      

      The default is to use the /usr/local directory.

    • --with-libevent

      If you have installed libevent and configure cannot find the library, use the --with-libevent option to specify the location of the installed library.

    • --enable-64bit

      To build a 64-bit version of memcached (which enables you to use a single instance with a large RAM allocation), use --enable-64bit.

    • --enable-threads

      To enable multi-threading support in memcached, which improves the response times on servers with a heavy load, use --enable-threads. You must have support for the POSIX threads within your operating system to enable thread support. For more information on the threading support, see Section 15.6.2.7, “memcachedThread Support”.

    • --enable-dtrace

      memcached includes a range of DTrace threads that can be used to monitor and benchmark a memcachedinstance. For more information, see Section 15.6.2.5, “Using memcached and DTrace”.

  4. Run make to build memcached:

    shell> make
    
  5. Run make install to install memcached:

    shell> make install

上面的英语不用翻译吧。那下面我就说一下我在安装过程遇到了那些错误。

1:通过configure命令进行编译。告诉你libevet没有安装。

但是哥明明安装了,好不好。你找不到那哥给你制定路径让你找。使用--with-libevent参数指定寻找路径,还尼玛找不到。查找到一个相同情况下libevent找不到的情况。但是那种情况操蛋的是安装好之后,在你通过命令启动memcached的时候报告libevent没安装。这个时候你可以通过命令:

LD_DEBUG=libs /your memcached bin/ -v,可以获取到memcached是依赖那些包和去哪里寻找所需要的包。可是哥这里我这还没安装成功那。下面贴出我安装成功之后再运行此命令效果。

18999: find library=libevent-1.4.so.2 [0]; searching
18999: search cache=/etc/ld.so.cache
18999: search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:
/lib/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:
/usr/lib/i686:/usr/lib/sse2:/usr/lib (system search path)
18999: trying file=/lib/tls/i686/sse2/libevent-1.4.so.2
18999: trying file=/lib/tls/i686/libevent-1.4.so.2
18999: trying file=/lib/tls/sse2/libevent-1.4.so.2
18999: trying file=/lib/tls/libevent-1.4.so.2
18999: trying file=/lib/i686/sse2/libevent-1.4.so.2
18999: trying file=/lib/i686/libevent-1.4.so.2
18999: trying file=/lib/sse2/libevent-1.4.so.2
18999: trying file=/lib/libevent-1.4.so.2
18999: trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2
18999: trying file=/usr/lib/tls/i686/libevent-1.4.so.2
18999: trying file=/usr/lib/tls/sse2/libevent-1.4.so.2
18999: trying file=/usr/lib/tls/libevent-1.4.so.2
18999: trying file=/usr/lib/i686/sse2/libevent-1.4.so.2
18999: trying file=/usr/lib/i686/libevent-1.4.so.2
18999: trying file=/usr/lib/sse2/libevent-1.4.so.2
18999: trying file=/usr/lib/libevent-1.4.so.2

  可以看出memcached会到固定的地方寻找依赖,我在安装的时候就算指定的路径还是提示找不到libevent可能是版本不对,从上面也看到对于每个包都会在包名末尾有个版本号。所以,我又下载了另外一个libevent,重新安装了libevent在另一个目录/usr/local下,默认安装应该是/usr/lib或者/usr/lib64下面。然后在安装memcached的时候指定了我刚安装的libevent位置,这次编译通过了。这个问题算是告一段落。

  但是在启动memcached的时候,又有日志报告找不到libevent,这时候你就可以使用上面的LD_DEBUG命令了,可以可看到类似上面的输出。在输出里你就可以看到它是如何寻找libevent的。这时候你可以每次启动的时候制定libevent路径,但是更好的办法是创建一个软连接,把你安装libevent的路径创建一个软连接到memcached寻找的路径中。命令示例如下:ln -s /usr/local/lib/libevent-1.4.so.2  /usr/lib/libevent-1.4.so.2

  这里的疑问是为何memcached在编译的时候不是寻找某个版本之上的版本,而是要选择某个确定的版本。如果在安装的时候只选择某个特定的版本,那memcached安装版本与你机器上安装的libevent版本不对,那就会出现我上面的问题。这里就算你指定路径,它依旧是傻傻的找不到。但是如果memcached编译寻找libevent是寻找大于某个版本的libevent,那就会避免上面的问题了。

2:当编译完之后,使用make&&make install命令的时候又出现了错误。错误如下:

make  all-recursive
make[1]: Entering directory `/home/mem/memcached-1.2.2'
Making all in doc
make[2]: Entering directory `/home/mem/memcached-1.2.2/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/mem/memcached-1.2.2/doc'
make[2]: Entering directory `/home/mem/memcached-1.2.2'
if gcc -DHAVE_CONFIG_H -I. -I. -I.  -DNDEBUG -I/usr/include   -g -O2 -MT memcached-memcached.o -MD -MP -MF ".deps/memcached-memcached.Tpo" \
          -c -o memcached-memcached.o `test -f 'memcached.c' || echo './'`memcached.c; \
        then mv -f ".deps/memcached-memcached.Tpo" ".deps/memcached-memcached.Po"; \
        else rm -f ".deps/memcached-memcached.Tpo"; exit 1; \
        fi
memcached.c: In function ‘add_iov’:
memcached.c:582: error: ‘IOV_MAX’ undeclared (first use in this function)
memcached.c:582: error: (Each undeclared identifier is reported only once
memcached.c:582: error: for each function it appears in.)

就是说IOV_MAX没有定义,首先是去SO上查找,可以点击地址查看so answer

但是,我试了一下没解决问题,所以继续搜索。看到下面这个连接:51cto 答案,问题解决了。就是修改memcached.c中的头文件的定义。这个头文件会根据当前机器的架构对头文件进行不同的定义。更改完头文件定义,就可以解决了。

暂时遇到这两个坑。


libevent网站:http://libevent.org/

你可能感兴趣的:(多线程,centos,memcached,源码安装)