`
m635674608
  • 浏览: 5041954 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【FastDFS分布式文件系统】:FastDFS小文件上传性能测试及Python客户端上传操作

 
阅读更多

  由于要对比swift上传小文件以及fdfs上传小文件的性能,故做性能测试。

 

1.1 测试环境:

FastDFS集群的搭建方法:【FastDFS分布式文件系统之一】:搭建、部署、配置
tracker server1:node2
tracker server2:node3
group1:node4 / node5 / node6
group2:node7 / node8 / node9
client: node1

use_trunk_file = true(开启chunk存储模式)

replica = 3

1.2 机器参数
CPU:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Stepping: 4
CPU MHz: 2100.180
BogoMIPS: 4199.42
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23

内存:
126G

硬盘:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk 
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 195.5G 0 part /

sdb 8:16 0 6.4T 0 disk /mnt/xfsd

1.3 测试方法:

文件生成分为两种:1.随机生成1~100KB之间大小的文件;2.全部大小都为133KB大小的文件。

文件生成程序:

#!/usr/bin/python
from random import randint
import os
 
data_dir = os.sys.argv[1]
n = int(os.sys.argv[2])
 
if not os.path.exists(data_dir):
    os.makedirs(data_dir)
 
for x in range(0, n):
    with open("%s/file_%d" % (data_dir, x), 'wb') as fout:
        fout.write(os.urandom(1024 * randint(80, 180)))

 

python中os.urandom(n)的作用:随机产生n个字节的字符串。

通过fastdfs-python-sdk:https://github.com/hay86/fdfs_client-py 编写上传测试文件,文件上传分为串行和并行两种方式:

串行上传:对若干个文件依次调用上传接口,直到完成所有文件上传为止。

并行上传:启动多个进程同时上传文件,每个进程上传多个文件。

串行测试脚本:

#!/usr/local/bin/python2.7
import os
import time
import sys 
from multiprocessing import Process
try:
    from fdfs_client.client import *
    from fdfs_client.exception import *
except ImportError:
    import_path = os.path.abspath('../')
    sys.path.append(import_path)
    from fdfs_client.client import *
    from fdfs_client.exceptions import *
#size_total = 0
if __name__ == '__main__':
    starttime = time.time()
    filenumbers = 100000 #number of processes                                                                                                                                                
         
    client = Fdfs_client('/opt/fdfs_client-py/fdfs_client/client.conf')
    try:
        for i in range(filenumbers):
            filename = '/data/files/small/smallfile' + str(i)
            client.upload_by_filename(filename)
    except Exception,e:
        print "error" + str(e)
    endtime = time.time() 
    #print "%d byte has been stored into the fdfs." % size_total
    print "%f seconds for sequence processing computation." % ( endtime - starttime )
    #print size_total
    #print "speed is %f KB/s" % size_total/1024/(endtime-starttime)

并行测试脚本:

#!/usr/local/bin/python2.7                                                                                                                  
 
import os
import time
import sys 
import multiprocessing
from multiprocessing import Process
try:
    from fdfs_client.client import *
    from fdfs_client.exception import *
except ImportError:
    import_path = os.path.abspath('../')
    sys.path.append(import_path)
    from fdfs_client.client import *
    from fdfs_client.exceptions import *
 
client = Fdfs_client('/opt/fastdfs/fdfs_client-py/fdfs_client/client.conf')
 
 
def uploadfile(begin,end,t_time,t_count,t_size,lock):
    try:
        for idx in range(begin,end):
            filename = '/data/files/small-10w/smallfile'+str(idx)
            for y in range(5):
                starttime = time.time()
                ret = client.upload_by_filename(filename)
                endtime = time.time()
                if(ret['Status'] != 'Upload successed.'):
                    os.system('echo upload fail >> log')
                else:
                    os.system('echo upload success >> log')
                #    print ret['Status']
                with lock:
                    t_count.value += 1
                    t_time.value += endtime - starttime
                    t_size.value += os.path.getsize(filename)
            
    except Exception,e:
        print "error" + str(e)
 
if __name__ == '__main__':
    process = []
 
    nprocess = int(os.sys.argv[1])
    file_per_process = 100000/nprocess
	
	lock = multiprocessing.Lock()
 
    total_time = multiprocessing.Value('f',0.0)
    total_count = multiprocessing.Value('i',0)
    total_size = multiprocessing.Value('f',0.0)
 
    for i in range(nprocess):
        process.append( Process(target=uploadfile,args=(i * file_per_process , (i+1) * file_per_process, total_time,total_count,total_size,lock)))
 
    for p in process:
        p.start()
 
    for p in process:
        p.join()
 
    print "%f seconds for multiprocessing computation." % total_time.value
    print "%d total count." % total_count.value
    print "%f total size." % total_size.value
    os.system("wc -l log")

 

2.测试结果

串行上传(文件大小80KB~180KB之间,平均文件大小130KB):

 

上传文件总个数(KB)
上传文件总大小(KB)
平均速度(MB/s)
平均每个文件上传所用时间(ms)
上传失败次数
1000
130530
21.28 5.97
0
1000
130530
22.60
5.62
0
10000
1294566
22.94
5.53
0
10000
1294566
23.11
5.49
0
100000
13018299
21.05
6.03
0
100000
13018299
22.06
5.75
0

并行上传(文件大小80KB~180KB之间,平均文件大小130KB):
并发数
上传文件总个数 平均每个文件上传所用时间(ms) 上传失败次数
100 500000 14.62 0
200
500000
17.18
0
250
500000
22.19
0
400
500000
30.62
0
500
500000
28.55
0
800
500000
27.17
0
1000
500000
42.64
0

 

Swift上传性能:

上传500000个对象到Swift中

并发数

上传文件总个数

平均每个文件上传所用时间(ms)

上传失败百分比

100

500000

78.91

0

200

500000

144.27

0

250

500000

157.63

5.69%

400

195610

171.22

60.88%

500

193629

136.09

61.27%

 

3.结论

  • 速度方面,FastDFS在高并发的情况下上传小文件所用时间要比Swift小很多。
  • 稳定性方面:在高并发的情况下,FastDFS上传失败次数为0次,比Swift上传失败次数少。

4.Python并行

       起初想用多线程来进行几十万次的并发上传,以为线程相对轻量,占用资源少,那么最终统计的上传时间会比较少,其实不然,多线程模拟并发上传比多进程要花 更大的时间,原因跟python所谓的GIL(Global Interpreter Lock)全局解释锁有关。具体它是什么可以参考一篇文章:http://cenalulu.github.io/python/gil-in-python/给出一个让人困惑的结论:不要使用多线程,请使用多进程。那么就简单讲一下python multiprocessing。
一个错误的例子:
import time
from multiprocessing import Process, Value

def func(val):
    for i in range(50):
        time.sleep(0.01)
        val.value += 1

if __name__ == '__main__':
    v = Value('i', 0)
    procs = [Process(target=func, args=(v,)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value
多进程实现很简单,使用Process,然后传入目标函数以及参数,start()方法启动进程 join()方法等待所有进程结束之后主进程再结束,其中v是通过multiprocessing.Value定义的变量,是进程之间共享的变量。那么我 们期望最终得到的v.value会是500,但是结果却是比500少的数字,原因就是没有加锁,在进程竞争资源的情况下没有lock住共享变量。那么如何 加锁?
方法一:
import time
from multiprocessing import Process, Value, Lock

def func(val, lock):
    for i in range(50):
        time.sleep(0.01)
        <strong>with lock:
            val.value += 1</strong>

if __name__ == '__main__':
    v = Value('i', 0)
    lock = Lock()
    procs = [Process(target=func, args=(v, lock)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value
方法二:
import time
from multiprocessing import Process, Value, Lock

def func(val, lock):
    for i in range(50):
        time.sleep(0.01)
        <strong>lock.acquire()
        val.value += 1
	lock.release()
</strong>
if __name__ == '__main__':
    v = Value('i', 0)
    lock = Lock()
    procs = [Process(target=func, args=(v, lock)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value

两篇参考文章:
 

Author:忆之独秀

Email:leaguenew@qq.com

注明出处:http://blog.csdn.net/lavorange/article/details/50829552

 

 

http://m.blog.csdn.net/article/details?id=50829552

分享到:
评论

相关推荐

    fastdfs分布式文件服务器

    【FastDFS分布式文件服务器详解】 FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要针对海量小文件存储设计,适用于互联网行业的图片、文档等各类文件的存储管理。其核心设计目标是高可用性、高扩展性和低...

    Python-基于Fastdfs和Python的分布式文件存储系统

    FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,它专为互联网应用设计,支持大量小文件的存储。本项目“Python-基于Fastdfs和Python的分布式文件存储系统”旨在利用Python语言与FastDFS进行集成,实现高效...

    毕业设计:基于Python+Fastdfs的分布式文件存储系统.zip

    【标题】:“毕业设计:基于Python+Fastdfs的分布式文件存储系统” 【描述】:“计算机毕设源码”通常指的是学生在完成计算机科学或相关专业毕业设计时编写的代码,这个项目选择了Python语言与Fastdfs作为核心技术...

    基于Fastdfs和Python的分布式文件存储系统.zip

    此外,Python还支持各种Web框架,如Django、Flask等,可以构建Web服务,为用户提供API接口或者图形化界面来操作文件存储系统。 在实现过程中,可能涉及到以下关键技术点: 1. 文件分块策略:为了提高上传和下载的...

    FastDFS分布式存储服务器安装及nginx的安装配置

    《FastDFS分布式存储服务器与Nginx安装配置详解》 在现代互联网应用中,数据的存储和访问效率至关重要。FastDFS作为一个轻量级的分布式文件系统,被广泛应用于中小型企业的文件存储服务,而Nginx作为高性能的反向...

    Python3与fastdfs分布式文件系统如何实现交互

    本文将深入探讨如何使用Python3与FastDFS进行交互,以便在Python应用程序中便捷地上传、下载等操作文件。 首先,我们需要确保已经正确配置了FastDFS分布式文件系统。这通常包括安装FastDFS服务端,设置tracker和...

    Linux下FastDFS分布式存储高可用集群-总结及部署记录(个人珍藏版)

    Linux下的FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要针对互联网行业的大量小文件存储场景设计,如图片、文档等。FastDFS提供了高可用的集群部署方案,能够保证服务的稳定性和数据的一致性。在本文中...

    分布式文件系统研究_分布式_分布式文件系统_

    分布式文件系统是一种高级的数据存储架构,它通过网络将多台计算机连接起来,形成一个统一的、高可用的存储系统。这种系统能够提供高效的数据访问、管理和备份能力,尤其适合处理大规模的数据存储需求。在本研究中,...

    基于SpringBoot+Netty+MUI+H5Plus+Nginx+FastDFS分布式文件系统搭建的聊天系统

    该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...

    轻量级分布式文件系统 FastDFS.7z

    FastDFS是一个开源的高性能、轻量级的分布式文件系统,它对文件进行管理,包括文件存储、文件同步、文件访问(文件上传、文件下载)等功能,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如...

    基于Python + Fastdfs + Nginx + Mysql 的分布式文件存储平台.zip

    本项目是基于Python、Fastdfs、Nginx和Mysql构建的一个分布式文件存储平台,它将这些技术巧妙地结合在一起,提供了一个高效、可靠的文件管理系统。 【Python】 Python是一种高级编程语言,以其简洁、易读的语法和...

    Laravel-fastdfs是分布式文件存储系统FastDFS的通用composer组件.zip

    Laravel-fastdfs是分布式文件存储系统FastDFS的通用composer组件,支持常见的php框架,如laravel,yii2,thinkphp5等. 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、...

    fastdfs安装包以及客户端包

    FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要设计用于解决大容量存储和负载均衡的问题。它对文件进行管理,包括文件存储、文件同步、文件访问(文件上传、文件下载)等功能,解决了大容量存储和负载...

    fastdfs python client 1.2.8

    FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,特别适合于存储大量小文件,如图片、文档等。在1.2.8版本中,它针对Python进行了优化,为Python开发者提供了更便捷的接口。本文将详细探讨FastDFS Python...

    FastDFS使用和优化.docx

    FastDFS 是一个开源的分布式文件系统,旨在解决大规模文件存储和高性能文件访问问题。以下是 FastDFS 的相关知识点。 一、FastDFS 简介 FastDFS 的整体架构主要包括三个角色:Tracker、Storage 和 Client。 1. ...

    fastdfs+nginx 分布式存储图片,支持动态缩略图

    FastDFS设计的主要目标是为互联网应用提供高效的文件存储服务,它将文件存储与文件访问分离,使得文件服务器专注于文件的存储,而客户端通过Tracker服务器获取文件的存储位置,然后直接与Storage服务器进行文件的...

    FastDFS_v5.05.tar.gz

    FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,专为互联网应用设计。它提供了文件存储、文件同步、文件访问(文件上传、文件下载)等功能,解决了大容量存储和负载均衡的问题,特别适合以文件为载体的...

Global site tag (gtag.js) - Google Analytics