如何使用Django / Apache / mod_wsgi / MySQL在EC2上最大化性能?

时间:2012-08-03 02:38:15

标签: mysql django apache mod-wsgi ubuntu-12.04

我正在使用Ubuntu 12.04 LTS在EC2 m1.medium实例(3.75 Gb内存,2 EC2计算单元,410 Gb实例存储,性能适中)上运行Django支持的站点。我的EC2实例上的MySQL设置如下(来自/etc/mysql/my.cnf):

  

key_buffer = 16M
  max_allowed_pa​​cket = 16M
  thread_stack = 192K
  thread_cache_size = 8
  query_cache_limit = 1M
  query_cache_size = 16M

来自/etc/apache2/sites-available/mysite.com的mod_wsgi设置:

  

WSGIDaemonProcess mysite.com user = me group = me processes = 7   threads = 20 maximum-requests = 1000000

根据我的配置,我可以设置的最大进程数/线程数/请求数是多少?我尝试了一些值,但它们导致MySQL崩溃。可以将MySQL key_buffer设置为0.75Gb(EC2实例上3.75Gb RAM的20%)吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

你所有的MySQL变量看起来都很低。首先,最重要的是:你使用的是哪种存储引擎? Key_buffer_size仅对 MyISAM 存储引擎有效。

如果您使用 MyISAM ,请执行以下操作:

> select sum(index_length) / 1024 / 1024 as index_size_MB from information_schema.Tables where Table_schema = 'knagy' and Engine = 'MyISAM';
+---------------+
| index_size_MB |
+---------------+
|    0.16992188 |
+---------------+

这将显示您的索引有多大。如果有足够的RAM,则应将此值大致设置为 key_buffer_size 。但是,不要将此值提高到可用内存的50-60%。

如果您正在使用 InnoDB ,请尝试将 innodb_buffer_pool 设置为包含索引的数据集大小:

> select sum(index_length + data_length) / 1024 / 1024 as innodb_MB from information_schema.Tables where Table_schema = 'knagy' and Engine = 'InnoDB';
+--------------+
| innodb_MB    |
+--------------+
| 403.04687500 |
+--------------+

您可以将其设置为可用RAM的80%,当然要考虑其他应用程序的内存使用情况。

只有通过其中一项更改,您才能获得显着的性能提升。

如果您看到 threads_created 状态变量快速增加,您可以将 thread_cache_size 增加到30-50左右。

当然还有很多进一步的优化,但这可以让你达到可能的最高性能的80-90%。

答案 1 :(得分:0)

您是否在所有网站都进行了实时监控,以便了解它的真实情况?观看我的PyCon演讲,你会发现有一件事情,这一切都取决于你的具体应用,我们对此一无所知。

http://lanyrd.com/2012/pycon/spcdg/