V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
lowman
V2EX  ›  Linux

Linux 将图片保存在本地目录的性能问题

  •  
  •   lowman · 2019-08-07 19:36:16 +08:00 · 5210 次点击
    这是一个创建于 1696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目开发中, 前期不打算搭建文件资源对象服务器, 但是项目中存在用户上传图片及文件的功能, 目前是将图片直接保存在服务器上的某个目录路径下, 然后配置通过 nginx 访问读取图片数据, 那么问题就是, 以这样的方式保存图片(因为 web server 层的原因, 尚且没有办法做到按日期创建目录, 分类保存图片, 目前是所有图片都保存在一个目录下), 当图片数量达到什么样的数量级的时候访问图片会出现比较严重的性能问题????

    如果项目运营稳步提升的话, 后续会考虑搭建一个专门的服务器来保存图片资源, 目前也正在调研几个开源项目, 但是就是希望能知道保存在单一目录下的数量瓶颈是多少, 以便后面能及时的迁移.

    有那位大佬对这方面的东西比较了解,还望告知一二, 小弟跪谢.............我也会喊 66666666..................手动狗头.gif

    31 条回复    2019-09-25 14:21:41 +08:00
    YIsion
        1
    YIsion  
       2019-08-07 19:42:20 +08:00   ❤️ 1
    最大问题不是性能问题,是带宽问题。图片的数据量级可是比字符串多了很多。
    lowman
        2
    lowman  
    OP
       2019-08-07 19:49:06 +08:00
    @YIsion 假设带宽, 服务器硬件资源都能满足, 单个目录下保存了大量的图片, 通过 nginx 访问获取. 在这样的前提条件下, 想知道这个数量瓶颈在哪里, 不是 ls 之类的操作.........
    akira
        3
    akira  
       2019-08-07 20:02:15 +08:00   ❤️ 1
    单目录下 大概 3w 个文件吧
    eonboy
        4
    eonboy  
       2019-08-07 20:05:57 +08:00
    大胆猜一下,会与文件系统有关系吧,所以系统相关信息多列点,有助于大佬解答...
    sunkwei
        5
    sunkwei  
       2019-08-07 21:15:09 +08:00   ❤️ 1
    另外一个思路,可以把图片内容保存到数据库中,如果写少读多,sqlite3 就行,作机器学习的 datasource 时,经常使用 sqlite3,几百万张照片没问题。
    bkmi
        6
    bkmi  
       2019-08-07 21:47:28 +08:00 via Android   ❤️ 1
    你后台只有一台服务器吗?
    如果只有一台那随便你怎么干了…
    不是的话还是单开存储服务吧
    xjtufreeman
        7
    xjtufreeman  
       2019-08-07 21:48:51 +08:00   ❤️ 1
    可以用 oss 啊
    airqj
        8
    airqj  
       2019-08-07 22:08:07 +08:00   ❤️ 1
    为什么不用 oss.....
    abcbuzhiming
        9
    abcbuzhiming  
       2019-08-07 22:11:18 +08:00   ❤️ 1
    abcbuzhiming
        10
    abcbuzhiming  
       2019-08-07 22:12:06 +08:00   ❤️ 1
    @xjtufreeman
    @airqj
    为什么你们一个二个都好像 oss 不要钱一样?
    arrow8899
        11
    arrow8899  
       2019-08-07 22:13:32 +08:00   ❤️ 1
    通过文件路径读取文件,基本不存在性能问题,查找文件是根据文件名 hash 查找;真正影响的应该是硬盘本身的性能。
    arrow8899
        12
    arrow8899  
       2019-08-07 22:15:53 +08:00   ❤️ 1
    @arrow8899 但是文件太多,对一些工具可能会有影响,比如 ls 命令,nginx 的 auto_index 功能等。
    Caballarii
        13
    Caballarii  
       2019-08-07 22:19:45 +08:00   ❤️ 1
    oss 能花了几个钱啊,比人力便宜多了
    jugelizi
        14
    jugelizi  
       2019-08-07 23:06:21 +08:00   ❤️ 1
    ...能用钱解决的事还不好
    说真的 小系统怎么玩都行
    客户量大的还是上云端 花的钱远比你后期投入的划算
    lowman
        15
    lowman  
    OP
       2019-08-07 23:25:39 +08:00
    @eonboy 文件系统的格式限制的是单个目录下的文件数量, 整个服务器的文件数量应该与系统的 inod 有关
    lowman
        16
    lowman  
    OP
       2019-08-07 23:27:45 +08:00
    @bkmi 多台 web server 其实也可以做到直接保存到本地目录的, 比如在 nginx 配置一下, 当然还是看需求
    lowman
        17
    lowman  
    OP
       2019-08-07 23:28:03 +08:00
    @xjtufreeman 后续会考虑
    lowman
        18
    lowman  
    OP
       2019-08-07 23:31:26 +08:00
    @abcbuzhiming 文件系统的差异影响的是最大数量, 这点是知道的, 疑惑的就是在不超过最大数量的前提下, 当数量达到多少, 通过 nginx 读取图片时, 会出现体验过差, 应该还是磁盘 io 性能的限制
    lowman
        19
    lowman  
    OP
       2019-08-07 23:32:36 +08:00
    @abcbuzhiming 后续看项目发展吧, 起不来, 肯定不去考虑这些了
    lowman
        20
    lowman  
    OP
       2019-08-07 23:33:37 +08:00
    @arrow8899 我在很多地方查询到的答案和你的理解都比较类似
    alcarl
        21
    alcarl  
       2019-08-07 23:56:08 +08:00 via Android
    可以自己测试的啊,复制几百万文件还不简单,一般都不建议放一个目录里,一台机器一个目录,备份都不好备份,如果炸了就全完了。。。。。
    lowman
        22
    lowman  
    OP
       2019-08-08 08:52:48 +08:00
    @alcarl 预估达不到百万级的数据量, 正在写个脚本测一下, 至于容灾方面的东西, 估计得后续看项目运营情况, 小公司, 小项目,成本有限
    yidinghe
        23
    yidinghe  
       2019-08-08 09:06:23 +08:00 via Android
    这个只要磁盘空间够,不会有什么性能问题,如果磁盘 IO 太频繁还可以在 Nginx 上配缓存。
    lowman
        24
    lowman  
    OP
       2019-08-08 09:27:26 +08:00
    @yidinghe 刚测试了一下, 在本机测试, 本机浏览器随机访问 nginx 进而获取某个目录的某张图片, 固态硬盘, 复制了 10 万张图片(这里应该远远不止 3w 的说法, 但与文件系统, inode 有关系, inode 用完, 就算磁盘空间再大也写不进去的), 察觉不到任何延迟, 只是进行 ls 之类的操作时有点卡顿现象(应该会随着文件数越大越明显).......如果是这样的话, 项目估计上线以后还能撑一段时间..............看来我就是一个得过且过的程序员..................
    crella
        25
    crella  
       2019-08-08 09:54:24 +08:00 via Android
    我看微信安卓版放图片是根据(hash?)的前几位字符的啊,比如 sfjbxkkb.jpg 就放到./s/f/j/b/sfjbxkkb.jpg ,这个功能拿个 py/rb 挺好实现的啊
    hbolive
        26
    hbolive  
       2019-08-08 10:37:18 +08:00   ❤️ 1
    根据文件名读取文件,几十万都没啥太大问题的。。
    lowman
        27
    lowman  
    OP
       2019-08-08 11:16:46 +08:00
    @crella 后台在数据表就保存图片的目录限制住了(需要实现某些需求导致的问题), 后续看情况会搭建专门的服务器保存图片
    linbingcheng
        28
    linbingcheng  
       2019-08-08 14:17:09 +08:00   ❤️ 1
    上传文件呀,这个东西还是得考虑下安全问题的,搞个 ftp 存应该没错
    lowman
        29
    lowman  
    OP
       2019-08-09 17:44:58 +08:00
    @linbingcheng 是上传图片, 目前还没有允许用户上传文本文件的功能 , 至于你说的安全问题, 不知道你担心的是否为恶意用户上传可执行的恶意脚本的问题? 我这里有根据图片内容去判断上传文件是否为图片(不是判断图片尾缀), 如果不是图片文件就不进行保存. 目前也只是做到这一层面的安全验证了.
    ungrown
        30
    ungrown  
       2019-09-12 10:04:50 +08:00
    按文件名或者文件内容算出 hash
    按前两位或者前四位 hash 分级目录
    abcdef...1234.jpg -> /ab/cd/ef...1234.jpg
    这个方案被广泛应用,实际证明性能不错,除非你是阿里、腾讯、亚马逊、微软那种云平台厂商的数据量级别
    而且其实挺灵活的,你想多加一级目录或者减少一级目录,只要改几行代码,写几行 shell 就行了
    lowman
        31
    lowman  
    OP
       2019-09-25 14:21:41 +08:00
    @ungrown 谢谢,是一个思路. 目前已经实现了按日期创建目录保存.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2820 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:23 · PVG 21:23 · LAX 06:23 · JFK 09:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.