django服务怎么样才能全部利用cpu资源

Fover 发布于 2016/08/17 23:21
阅读 504
收藏 2

hello,各位。

我使用django和rest framework 写了一个简单的api接口,数据库用的是sqlite (后面用pgsql性能还下降了一点)

就一个model 可以简单的理解为book和auth 这样两个例子的model

我将服务搭建到树莓派(3b)上 4核 1g内存 (树莓派性能是差了点,开始之前我还是有心理准备)

我用ab测试,测试指令(每秒200并发,一共请求1000次)

ab -t 200 -n 1000 http://192.168.3.250:8000/api/

使用传统的runserver方式启动一个服务 每秒的并发数是13,我惊呆了。所以我换了gunicorn。

使用gunicorn之后,gunicorn+gevent 每秒并发11。

我在gunicorn上尝试加上 -w 4 参数多建立几个进程来提高处理速度,然而依旧差强人意。并发数量大概在12左右。

我使用htop观察进程的cpu占用和内存占用,发现进程占用基本上在50%左右4个核的平均值。内存的使用也不高,一百多m.

使用iotop观察io读写,在请求的过程中并没有发现有大量的io产生,虽然树莓派的sd卡读写比较烂,但是io就偶尔几十k顶多300k/s左右。

so,我很疑惑,在有大量并发请求的情况下,200的并发请求对于树莓派来说我认为是量比较大的请求了,这时候cpu应该会忙于请求工作开始负载,但是并没有满载,只有50%左右。

是什么原因导致的呢?python语言本身处理速度过慢导致?还是我并没有正确的配置我的django项目?

附上我使用gunicorn的代码

gunicorn -k gevent yoyoyo.wsgi:application -b 127.0.0.1:8000 --reload -w 4


加载中
3
eechen
eechen
sudo apt-get install sysstat
看CPU:  pidstat -p PID 1
看内存: pidstat -r -p PID 1
看磁盘: pidstat -d -p PDI 1
为了方便排查,建议只开一个工作进程.
把SQLite文件放到内存上/dev/shm测试可以排除磁盘的影响.

<?php
header('Content-Type: text/plain; charset=utf-8');
$file = '/dev/shm/app/data.db3';
$ddl = "
BEGIN;
CREATE TABLE IF NOT EXISTS queue (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id      INTEGER
);
COMMIT;
";
if(!file_exists($file)) {
    $db = new PDO('sqlite:'.$file);
    $db->exec($ddl);
} else {
    $db = new PDO('sqlite:'.$file);
}
$user_id = time();
$stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)');
$stmt->execute(array($user_id));
echo 'rowCount:'.$stmt->rowCount()."\n";
echo 'lastInsertId:'.$db->lastInsertId()."\n";
$stmt = $db->query('SELECT * FROM queue WHERE id = '.$db->lastInsertId());
var_export($stmt->fetchAll(PDO::FETCH_ASSOC));
// sudo mkdir -m 777 /dev/shm/app
// php -S 127.0.0.1:8080 -t /www >/dev/null 2>&1 &
// ab -c100 -n5000 http://127.0.0.1:8080/
// ab -c100 -n500   http://127.0.0.1:8080/
Ubuntu(i5-3230M)上RPS达到2660,而树莓派(BCM2709)上只有185(如果SQLite不在内存上而在SD卡上RPS会降到30).同样的逻辑,在SD卡上比内存/dev/shm上慢了6倍,这时就是磁盘I/O读写的瓶颈.跟i5-3230M比,BCM2709慢了十几倍,这时就是CPU的性能瓶颈了.
护目评论
护目评论
回复 @eechen : 不是什么东西都能粗略的呀,你这代码,真要拿来用的时候,那多出来的数据会加入你后续排序和计算欧几里得距离的过程,影响性能的呀。而且这种影响是毫无意义的浪费,要是写php都像你这么浪费,谁还敢用php. --via 张亦俊
护目评论
护目评论
怎么感觉整个osc都把你当猴看,做猴耍一样,哈哈[79] via 金三胖
乌龟壳
乌龟壳
回复 @Fover : 树莓派跑python还带框架,会比较慢
Fover
Fover
@乌龟壳 嗯,我知道,只是现在在学习阶段,用树莓派来试试。
下一页
1
wei2011
wei2011
用gunicorn -w 4,四核四个进程,理论上能用所有的核了。至于为什么不能用100%,可能哪里出现瓶颈了,比如io,或django本身就比较慢;我觉得arm的cpu性能比较慢,可能不上gevent还快点,可以试试不用gevent,只用gunicorn试试,或换一个wsgi服务器,比如bjoern试试
Fover
Fover
bjoern 晚上回去试试。昨天最后替换了gevent改为meinheld 性能有所提升,但是幅度并不大,晚上回去试试eechen的方法,将数据库挂载到内存中看看。
0
黑暗圣堂武士
黑暗圣堂武士
并不是CPU占用最大,性能才最高啊。
Fover
Fover
因为cpu利用率只有50%左右,所以我认为还有提升空间的。
返回顶部
顶部