免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3636 | 回复: 4
打印 上一主题 下一主题

[其他] 一点测试数据 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-01 15:05 |只看该作者 |倒序浏览
测试了高并发, 低并发下几种锁的性能差异:
  1. #define _GNU_SOURCE

  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include "lkf.h"
  5. #include <pthread.h>
  6. #include <unistd.h>
  7. #include <assert.h>
  8. #include <time.h>
  9. #include <sys/time.h>

  10. struct timespec base;
  11. int timer_init(){
  12.     int n = clock_gettime(CLOCK_MONOTONIC,  &base);
  13.     if(0 != n){
  14.         return -1;
  15.     }
  16.     return 0;
  17. }

  18. unsigned int now(){
  19.     struct timespec tp;
  20.     int n = clock_gettime(CLOCK_MONOTONIC,  &tp);
  21.     if(0 != n){
  22.         assert(0);
  23.     }
  24.     uint64_t ms = (tp.tv_sec - base.tv_sec) * 1000 + 1e-6 * (tp.tv_nsec - base.tv_nsec);
  25.     return (unsigned int) ms;
  26. }


  27. static LKF_LIST(head);

  28. struct ctx {
  29.     struct lkf_node entry;
  30.     int n;
  31. };

  32. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

  33. #define lock1(lkp) do{  \
  34.     while(!__sync_bool_compare_and_swap(lkp, 0, 1)){    \
  35.         sched_yield(); \
  36.     }   \
  37. }while(0)

  38. #define lock2(lkp) do{  \
  39.     while(!__sync_bool_compare_and_swap(lkp, 0, 1)){    \
  40.         continue; \
  41.     }   \
  42. }while(0)

  43. #define unlock(lkp) do{    \
  44.     *(lkp) = 0;  \
  45. }while(0)

  46. int lck = 0;

  47. void* thread_func(void* any)
  48. {
  49.     int n2 = 0;
  50.     int n3 = 0;
  51.     unsigned t1, t2 = now();
  52.     while (1) {
  53.         struct ctx* ctx = NULL;
  54. #if 1
  55.         struct lkf_node* node = lkf_node_get(&head);
  56.         if (node == NULL) {
  57.             __sync_add_and_fetch(&n2, 1);
  58.             continue;
  59.         }

  60.         struct lkf_node* nd = NULL;
  61.         do {
  62.             nd = lkf_node_next(node);
  63.             if (nd == NULL) {
  64.                 continue;
  65.             }

  66.             __sync_add_and_fetch(&n3, 1);
  67.             lkf_node_put(&head, nd);
  68.             if (n3 % 10000 == 0) {
  69.                 t1 = now();
  70.                 printf("%d, %d \n", n2, t1 - t2);
  71.                 t2 = t1;
  72.             }
  73.         } while (nd != node);
  74. #else
  75.         //lock1(&lck);
  76.         // lock2(&lck);
  77.         pthread_mutex_lock(&mutex);
  78.         struct lkf_node* node = lkf_node_get_one(&head);
  79.         pthread_mutex_unlock(&mutex);
  80.         //unlock(&lck);
  81.         if (node == NULL) {
  82.             __sync_add_and_fetch(&n2, 1);
  83.             continue;
  84.         }

  85.         struct lkf_node* nd = node;
  86.         __sync_add_and_fetch(&n3, 1);
  87.         lkf_node_put(&head, nd);
  88.         if (n3 % 10000 == 0) {
  89.             t1 = now();
  90.             printf("%d, %d \n", n2, t1 - t2);
  91.             t2 = t1;
  92.         }
  93. #endif
  94.         n2 = 0;
  95.     }
  96.     return NULL;
  97. }

  98. int main(void)
  99. {
  100.     timer_init();

  101.     for (int i = 0; i < 2000; ++i) {
  102.         struct ctx* ctx =  malloc(sizeof(struct ctx));
  103.         ctx->entry.next = NULL;
  104.         lkf_node_put(&head, &ctx->entry);
  105.     }

  106.     pthread_t tid;
  107.     for (int i = 0; i < 8; ++i) {
  108.         pthread_create(&tid, NULL, thread_func, NULL);
  109.     }

  110.     pause();
  111.     return 0;
  112. }
复制代码
得到数据如下:
800 threads:
lock less batch  2,30 seconds
lock less single 80.x --- 100.x seconds
spin lock        infinite
yield lock       1.x seconds
mutex            5.x seconds


4 threads:
lockless batch   3ms
lock less single 12ms
yield lock       11ms
spin lock        16ms
mutex            3,40 ms

8 threads:
lockless batch   20% 15ms,  80% 5ms
lock less batch  20% 140s,  80% 60ms
spin lock        3%  120ms, 97%  50ms
yield lock       20ms
mutex            60ms

机器是 azure 上的一台 a3 4 核 的虚拟机
无锁使用的是之前我发的那份
基本结论如下:

线程数小于或接近 cpu 个数的情况下, 我的自己那个无锁链表 批取模式性能最高, 单取性能还算可以, 但与 shedu_yield 锁稍差那么一点, 比 spin lock 锁高那么一点, 但到了 8 线程, 就已经被 spin lock 锁超越了
高并发下, 还是 同步锁性能最高, spin lock 是找死, 用无锁也是脑残的行为

在任何负载下, 通过CAS加轻量的 shed_yield 实现的 yield 锁性能都高于 mutex,  futex 没测试, 估计性能位于 yield 锁和 mutex 之间
mutex 基本上似乎都表现中庸, 似乎在任何情况下, 都是第二选择

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2014-05-01 15:16 |只看该作者
加上了 futex, 表明确实如猜测;
在这个测试中所有线程都没有阻塞情况, 因此 futex 比较吃亏, 若存在大量阻塞, 估计 futex 表现会超过 yiled 锁
  1.     #define lock(lkp) \
  2.     do {  \
  3.         if (!__sync_bool_compare_and_swap(lkp, 0, 1)) {    \
  4.             if (*lkp == 2) { \
  5.                 syscall(__NR_futex, lkp, FUTEX_WAIT, 2, NULL, NULL, 0); \
  6.             } \
  7.             \
  8.             while (0 != __sync_lock_test_and_set(lkp, 2)) { \
  9.                 syscall(__NR_futex, lkp, FUTEX_WAIT, 2, NULL, NULL, 0); \
  10.             } \
  11.         } \
  12.     } while (0)

  13.     #define unlock(lkp) \
  14.     do { \
  15.         wmb(); \
  16.         if (2 == __sync_lock_test_and_set(lkp, 0)) { \
  17.             while (-1 == syscall(__NR_futex, lkp, FUTEX_WAKE, 1, NULL, NULL, 0)); \
  18.         } \
  19.     } while (0)
复制代码
800 threads:
lock less batch  2,30 seconds
lock less single 80.x --- 100.x seconds
spin lock        infinite
yield lock       1.x seconds
futex            4.x
mutex            5.x seconds


4 threads:
lockless batch   3ms
lock less single 12ms
yield lock       11ms
spin lock        16ms
futex            20ms
mutex            3,40 ms

8 threads:
lockless batch   20% 15ms,  80% 5ms
lock less batch  20% 140s,  80% 60ms
spin lock        3%  120ms, 97%  50ms
yield lock       20ms
futex            40ms
mutex            60ms

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2014-05-01 18:50 |只看该作者
找工作,  linux 系统编程, 服务器编程
35K 左右

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2014-05-01 22:43 |只看该作者
找工作,  linux 系统编程, 服务器编程
5K 左右

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2014-05-01 22:45 |只看该作者
劳动节还在奉献,楼主劳模真汉子!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP