开发者社区> 问答> 正文

关于RDS的性能

我最近刚从linode迁移到阿里云。
配置:
linode上,mysql是自己搭的,跟服务器是在同一台虚拟机上;4核
阿里云,则是ECS(8核)加RDS(600M内存那款);


迁移后,profiling的结果是,http request的cpu时间降低一半(合理),而数据库访问时间增加10倍。


比如某个request的数据库操作,profiling结果在迁移前是:
sql hit:46 sql time 17ms
而迁移后则
sql hit: 46 sql time 167ms


我大概检查了10来个request的profiling结果,都类似。

我观察了RDS的控制台的性能监测,操作时间都是微秒级别的,所以RDS本身不是瓶颈。


想确认的是:是不是ECS跟RDS之间的网络传输,导致了数据库操作时间的倍增?

展开
收起
打靶归来 2014-09-03 10:16:50 19988 0
14 条回答
写回答
取消 提交回答
  • Re关于RDS的性能
    学习
    2015-03-14 22:54:53
    赞同 展开评论 打赏
  • Re关于RDS的性能
    的确,耗时 比在原机器上(独立服务器)至少3倍左右

    独立服务器结果Processed in 0.003767 second(s), 11 Querie

    ECS+RDS结果Processed in 0.011767 second(s), 11 Querie

    估计网络传输影响。
    2015-03-09 10:11:20
    赞同 展开评论 打赏
  • Re关于RDS的性能
    内网延迟造成的吧...
    2014-12-08 02:06:38
    赞同 展开评论 打赏
  • 回 20楼(打靶归来) 的帖子
    你没有考虑大网络延时是双向的。
    2014-11-02 19:29:49
    赞同 展开评论 打赏
  • 路过瞧瞧
    2014-11-01 22:27:18
    赞同 展开评论 打赏
  • 唉,过来听天书!
    2014-10-29 23:02:53
    赞同 展开评论 打赏
  • ping的数据还好,1.x ms
    那现在的解释可能是,链接建立时间?
    我是新手,配置mysql有个connection pool,这算是使用了长连接吗?
    谢谢!
    2014-09-10 19:45:49
    赞同 展开评论 打赏
  • ping是网络层直接返回的,情况其实和select并不完全一样的。
    您可以在同一个连接里执行多次查询看下数据。比如1000次查询。这样会减少网络开销的影响。
    2014-09-10 15:09:04
    赞同 展开评论 打赏
  • Re关于RDS的性能
    相似情况等待分析
    2014-09-09 17:01:43
    赞同 展开评论 打赏
  • 您的无私奉献精神值得我们学习!向您致敬!
    2014-09-05 23:19:22
    赞同 展开评论 打赏
  • Re关于RDS的性能
    ping的数据如下:
    ds.aliyuncs.com (ip) 56(84) bytes of data.
    64 bytes from ip: icmp_req=1 ttl=54 time=1.21 ms
    64 bytes from ip: icmp_req=2 ttl=54 time=1.21 ms
    64 bytes from ip: icmp_req=3 ttl=54 time=1.23 ms
    64 bytes from ip: icmp_req=4 ttl=54 time=1.20 ms
    看起来还好

    -------------------------

    回1楼小猪猪的帖子
    嗯,我试试用hibernate 2nd level cache,减少数据库的直接访问

    -------------------------

    回2楼mayle的帖子
    ping的数据还好,1.x ms
    那现在的解释可能是,链接建立时间?
    我是新手,配置mysql有个connection pool,这算是使用了长连接吗?
    谢谢!

    -------------------------

    回7楼mayle的帖子
    我用的java melody做的profiling

    今天我打开了memcache,从而减少数据库访问,request的处理时间明显下降。
    进一步说明,确实是因为访问数据库造成了性能下降。

    另外,值得注意的是:数据库操作时间跟数据库sql hit的个数呈线性关系(我观察了大概10几个request,需要我也可以贴图),大概一个hit需费时4ms;这说明应该不是短长链接引起的;

    我截了图,只放了一个request的数据;第一行是memcache打开之前的,第二行是memcache打开之后的数据。

    -------------------------

    Re关于RDS的性能
    忘了说了,最后两列是数据库相关的。其中,最后一列是ms,倒数第二列是sql hit count
    第四列绿色的数字,是request总耗时。

    -------------------------

    回11楼mayle的帖子
    刚刚申请加入了,能否帮忙转贴下分析结果。我现在进去,之前的聊天记录我应该看不到的吧

    -------------------------

    Re关于RDS的性能
    我刚刚弄了一张最小的表,然后在RDS以及本地的数据库上都通过rest api进行操作,每个操作都只是简单的一个select
    数据如下


    第一行是数据库在RDS的性能,可以明显看到每个sql hit的mean time为3ms
    第二行是数据库在本地(本地是个性能非常一般的机器),每个sqlhit的mean time为0(说明小于1ms)

    期待大牛解释

    -------------------------

    Re关于RDS的性能
    #include <mysql/mysql.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <time.h>

    int main(void) {
       MYSQL *conn;
       MYSQL_RES *res;
       MYSQL_ROW row;
      /* Change me */
       char *server = "rdsql.rds.aliyuncs.com";
       char *user = "userXXX";
       char *password = "XXXXX";
       char *database = "XXXX";
      
       conn = mysql_init(NULL);
      
       /* Connect to database */
       if (!mysql_real_connect(conn, server,
             user, password, database, 0, NULL, 0)) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
       }
      
       struct timeval start, end;
       long secs_used,micros_used;

       gettimeofday(&start, NULL);

       char *sql_cmd = "SELECT * FROM user where id=11";
       /* send SQL query */
       if (mysql_query(conn, sql_cmd)) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
       }
       gettimeofday(&end, NULL);
       printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
       printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);
       secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
       micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);
       printf("Execute SQL %s micros_used: %d\n",sql_cmd, micros_used);


       res = mysql_use_result(conn);
       int num_fields = mysql_num_fields(res);
       /* output table name */
       printf("Result of %s is :\n", sql_cmd);
       while ((row = mysql_fetch_row(res)) != NULL) {
          int i;
          for (i = 0; i < num_fields; i++) {
              printf("%s ", row ? row : "NULL");
          }
          printf("\n");
       }

       /* close connection */
       mysql_free_result(res);
       mysql_close(conn);
      
      return 0;
    }


    -------------------------

    Re关于RDS的性能
    gcc -o select_one_row mysql_select_one_row.c -lmysqlclient

    -------------------------

    Re关于RDS的性能
    总结一下,使用RDS,肯定会比local的mysql要慢。
    具体是一个sql select操作,RDS大概会费时3到4ms,而local的mysql server,大概是0.4到0.5ms。

    原因应该就是网络延迟,ping rds大概是1.3ms;
    本来我不理解的是,local的0.4ms 加上网络延迟1.3ms,到了RDS最多也就是2ms,怎么会变成3到4ms;
    可能的解释是,ping也就是一个来回,而且是比较简单的网络协议;sql操作可能会涉及到一些握手行为,多加一个来回,就是多1ms多。

    -------------------------

    Re关于RDS的性能
    嗯,看我代码,profile相关的代码,只是包含了select 操作,没有包含建立链接以及关闭链接

    -------------------------

    回23楼joyzheng的帖子
    第一个问题见20楼
    第二个问题,我的理解,是的

    -------------------------

    Re关于RDS的性能
    最后回复下21楼,2000次的select,平均下来的sql操作也是3.x ms

    start: 1410340266 secs, 704180 usecs
    end: 1410340274 secs, 412382 usecs
    Execute SQL SELECT * FROM user where id=%d 2000 times, average micros_used: 3854  
    2014-09-03 16:01:27
    赞同 展开评论 打赏
  • 数据库访问的时间会增加,但是不会加这么多。

    最大可能是你ecs和rds不在一个节点,确认下吧。
    2014-09-03 13:12:40
    赞同 展开评论 打赏
  • 网络延时避免不了,但是你那个貌似增加太多了,你可以ping一下RDS,看延时多少,另外就是尽量使用长连接

    -------------------------

    回 6楼(打靶归来) 的帖子
    不知道你用什么Profiling工具分析的,不是特别好说,你最好把其中涉及到的sql语句让idb上跑一下,看下纯sql执行性能是否有下降

    -------------------------

    回 8楼(打靶归来) 的帖子
    加一下qq群,254668184,有人给你具体分析一下的,你这个我后来问了下java大神,说数据看上去基本算正常的,再具体的就得看一下你的实际情况了
    2014-09-03 12:31:28
    赞同 展开评论 打赏
  • ECS跟RDS之间的网络传输 肯定会增加时间  但是增加多少 这个没看过测试数据

      你可以本机安装Memcached    缓存一下查询数据试试 经常查询的数据 应该不会再有传输的延迟什么的
    应该可以降低的
    2014-09-03 11:40:04
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
TcpRT:阿里云RDS智能诊断系统云上大规模部署自动化服务的客户实践经验 立即下载
TcpRT:面向大规模海量云数据库的服务质量实时采集与诊断系 立即下载
袋鼠云基于阿里云RDS的数据库架构实践 立即下载

相关镜像