低内存服务器LAMP的内存优化(下)

只加载必要的模块

在Apache中的配置中,加载了很多不必要的模块,我们有必要把不必要的模块清理出去。你可以通过如下的命令查看你的Apache加载了哪些模块:

apache2ctl -M

如下的图片是Apache默认加载的模块;当然,你的也可能有所差异。


为了能让wordpress正常的运行,以下模块是必不可少的。

LoadModule dir_module modules/mod_dir.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule alias_module modules/mod_alias.so
LoadModule authz_host_module modules/mod_authz_host.so

LoadModule rewrite_module modules/mod_rewrite.so

你可以把不必要的模块注释掉以节约内存,或者通过如下命令来开启/关闭模块。如:

sudo a2enmod module_name          #开启模块

sudo a2dismod module_name         #关闭模块

当然,在更改后,你必须重载apache服务以生效。

sudo /etc/init.d/apache2 reload

更少的日志处理

如果你想最大程度的优化性能的话,你可以减少记录日志文件信息。在服务器上,我把错误日志级别设为error。另外,如果你可以不记录一些不必关心的统计数据(如:User-Ageng、http-referer)。

ErrorLog ${APACHE_LOG_DIR}/error.log


#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#

LogLevel error

我是这么处理的,具体配置就看你了。

优化My Sql服务

调整My Sql内存占用是很容易处理的。我将会告诉你为什么而不是告诉你怎么做。看完如下内容后,你很有希望能在你的服务器上做些优化。我们可以了解一下Mysql设置的以下几个方面:

  • 可以关闭的事件处理
  • 调整MySql的参数配置
  • 使用MySql的第三方配置助手

编辑Mysql的配置文件(/etc/mysql/my.conf),优化MySql性能。

可以关闭的事件处理

MySql允许我们为数据库的表指定不同的存储引擎,最常见的两种类型是InnoDBMyISAM。这两种存储引擎不同的具体表现如下:

  • MyISAM支持表级的锁定,这就意味着,当数据将要写入到数据库表时,整个表都处于锁定状态。也就是说要是同时有其他数据要写入到数据库表中的话,它必须等到上次操作完成之后才能执行。
  • InnoDB提供了行级的锁定,也就意味着,当向表中的某行写入数据时,也就只有那一行被锁定,表中的其他行都是可以进行写入的。

表级的锁定只有在数据库操作量很大时才会表现出来。对于一般的网站来讲,MyISAM通常能够提供更好的性能,更低的服务成本。

如果你决定只使用MyISAM型表,你必须把如下的配置项加入到mysql配置文件中:

default-storage-engine=MyISAM

default-tmp-storage-engine=MyISAM

如果你的数据库中的表都是MyISAM类型的,你可以关闭InnoDB引擎来节约内存。请在mysql配置文件中加入如下:

skip-innodb

如果你的数据库以前是用的InnoDB,你可以通过以下简单的脚本把InnoDb类型的表转化成MyISAM类型。

#!/bin/bash


MYSQLCMD=mysql


for db in `echo show databases | $MYSQLCMD | grep -v Database`; do
        for table in `echo show tables | $MYSQLCMD $db | grep -v Tables_in_`; do
                TABLE_TYPE=`echo show create table $table | $MYSQLCMD $db | sed -e's/.*ENGINE=\([[:alnum:]\]\+\)[[:space:]].*/\1/'|grep -v 'Create Table'`
                if [ $TABLE_TYPE = "InnoDB" ] ; then
                        mysqldump $db $table > $db.$table.sql
                        echo "ALTER TABLE $table ENGINE = MyISAM" | $MYSQLCMD $db
                fi
        done

done

调整MySql的参数配置

这里有几个参数让可以调整MyISAM,让其能更快更稳定的运行。

索引缓冲区的大小

这可能是影响MySql内存占用和性能最关键的一个配置了。MySql总是试图把所有的索引全部放入到索引缓冲区中,所以这就可以获得巨大的性能提升。SQL查阅时就会直接从内存中读取。你应该让你的关键字能够放入到缓冲区,我不能说设置多大最好,因为我并不知道你有多少的空闲内存。

查阅结果的缓存

如果你连续两次作相同的查阅,MySql并无须作第二次查阅。如果你想提高性能,你能满足你的需求,但它非常消耗内存。所以你要把他设置的不高不低。

以下的3个参数用来设置Mysql查询集缓存大小:

  • query_cache_size
  • query_cache_limit
  • query_cache_type
最大的连接数

关于最大的数据库连接与apache的进程数有关。所以如果你对apache作了限制,那就应该没有多大的事了。

表缓存

每当你访问某个表时,MySql总会在缓存表中加载一个参考表作为一个入口。这对于并发有请求,有着很大的性能提升,稍微的增加内存的占用。你可以不断的增加表的缓存,但是操作系统所能同时打开的文件是有限的,请记住这一点。如果把表缓存设置的太低,MY SQL也会罢工,你应该不希望这样的。

以下是我对我对轻云服务器的My sql配置做的处理:

[mysqld]
     port            = 3306
     socket          = /var/lib/mysql/mysql.sock
     skip-locking
     key_buffer = 16K
     max_allowed_packet = 1M
     table_cache = 4
     sort_buffer_size = 64K
     read_buffer_size = 256K
     read_rnd_buffer_size = 256K
     net_buffer_length = 2K
     thread_stack = 64K


     # For low memory, InnoDB should not be used so keep skip-innodb uncommented unless required
     skip-innodb


     # Uncomment the following if you are using InnoDB tables
     #innodb_data_home_dir = /var/lib/mysql/
     #innodb_data_file_path = ibdata1:10M:autoextend
     #innodb_log_group_home_dir = /var/lib/mysql/
     #innodb_log_arch_dir = /var/lib/mysql/
     # You can set .._buffer_pool_size up to 50 - 80 %
     # of RAM but beware of setting memory usage too high
     #innodb_buffer_pool_size = 16M
     #innodb_additional_mem_pool_size = 2M
     # Set .._log_file_size to 25 % of buffer pool size
     #innodb_log_file_size = 5M
     #innodb_log_buffer_size = 8M
     #innodb_flush_log_at_trx_commit = 1
     #innodb_lock_wait_timeout = 50


     [mysqldump]
     quick
     max_allowed_packet = 16M


     [mysql]
     no-auto-rehash
     # Remove the next comment character if you are not familiar with SQL
     #safe-updates


     [isamchk]
     key_buffer = 8M
     sort_buffer_size = 8M


     [myisamchk]
     key_buffer = 8M
     sort_buffer_size = 8M


     [mysqlhotcopy]

     interactive-timeout

My sql的第三方配置向导

我找到了Percona,他提供免费MYSQL配置向导让你的数据库服务器处于最佳的状态。

My sql服务监视

My sql存储统计决定你使用的最佳值。另外,这里有两个实用的工具,可以方便的来读统计数据并把它们以图表的形式展现:tuning-primer.shmysqltuner.pl

这些脚本将会控制你的数据库服务,最后,他会给你一个建议性的报告,你可以参照这在你的服务器上做一定的优化。

优化PHP 及其缓存

PHP程序并不会突然占用很大的内存,所以你不用担心它的内存占用,除非你的应用确实需要。我对此做过调查,找到一些小的调整可以降低PHP对服务器内存的占用。

; Limit the memory to 40M should be fine for barebones WordPress
memory_limit = 48M
realpath_cache_ttl=300

realpath_cache_size=1M

可选的PHP缓存

安装PHP的缓冲器,如Alternative PHP Cache。PHP缓存可以存储PHP执行后的结果,以便在重复的数据请求中不必重复执行PHP脚本。

pecl install apc

在php.ini中加入如下配置:

[APC]
extension=apc.so
apc.enabled=1
apc.shm_segments=1


;32M per WordPress install
apc.shm_size=128M


;Relative to the number of cached files (you may need to watch your stats for a day or two to find out a good number)
apc.num_files_hint=7000


;Relative to the size of WordPress
apc.user_entries_hint=4096


;The number of seconds a cache entry is allowed to idle in a slot before APC dumps the cache
apc.ttl=7200
apc.user_ttl=7200
apc.gc_ttl=3600


;Setting this to 0 will give you the best performance, as APC will
;not have to check the IO for changes. However, you must clear 
;the APC cache to recompile already cached files. If you are still
;developing, updating your site daily in WP-ADMIN, and running W3TC
;set this to 1
apc.stat=1


;This MUST be 0, WP can have errors otherwise!
apc.include_once_override=0


;Only set to 1 while debugging
apc.enable_cli=0


;Allow 2 seconds after a file is created before it is cached to prevent users from seeing half-written/weird pages
apc.file_update_protection=2


;Leave at 2M or lower. WordPress does't have any file sizes close to 2M
apc.max_file_size=2M


;Ignore files
apc.filters = "/var/www/apc.php"


apc.cache_by_default=1
apc.use_request_time=1
apc.slam_defense=0
apc.mmap_file_mask=/var/www/temp/apc.XXXXXX
apc.stat_ctime=0
apc.canonicalize=1
apc.write_lock=1
apc.report_autofilter=0
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
apc.lazy_classes=0

apc.lazy_functions=0

静态缓存

另外一个非常好的建议是安装一个HTTP加速器,如Varnish。它确实很有效,安装及配置Varnis是一个复杂且漫长的话题,所以不再缀述。

最终结果

我把服务器的相关配置分享以便能获取在最低配置上获取最佳的性能。我用的是Ubuntu 12.04 LTS, LAMP, Varnish, APC Cache,支持了3个Wordpress网站,能保证博客每天1W人的访问量。让我们来看看Blitz.io的测试报告吧:


正如你所看到的那样,当网站访问量达到42,735,587时,也仅仅只用0.23%用户连接超时。或许我还可以做些什么,但对于这我已经很开心了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值