Dev*_*hen 8 python optimization nginx redis uwsgi
我怀疑这是可能的,但这是问题和建议的解决方案(提出的解决方案的可行性是这个问题的对象):
我有一些"全局数据"需要可用于所有请求.我将这些数据保存到Riak并使用Redis作为访问速度的缓存层(现在......).数据被分成大约30个逻辑块,每个块大约为8 KB.
每个请求都需要读取这8KB块中的4个,从而从Redis或Riak读取32KB数据.这是对任何特定于请求的数据的补充,这些数据也需要被读取(这是相当多的).
假设每秒甚至3000个请求(这不是一个实时服务器,所以我没有实数,但3000ps是一个合理的假设,可能更多),这意味着从Addis或者Riak的ADDITION转移到已经没有的96KBps - 从应用程序逻辑中进行的重要其他调用.此外,Python 每秒3000次
解析这些8KB对象的JSON .
所有这一切 - 特别是Python必须反复反序列化数据 - 似乎是一种彻头彻尾的浪费,一个非常优雅的解决方案就是将反序列化数据缓存在Python中的内存中本机对象中,我可以定期刷新和当所有这些"静态"数据变得陈旧时.在几分钟(或几小时)内,而不是每秒3000次.
但我不知道这是否可行.您实际上需要一个"始终运行"的应用程序来缓存其内存中的任何数据.而且我知道在nginx + uwsgi + python组合中不是这种情况(与节点之类的东西相比) - 除非我非常错误,否则python内存数据不会持久存储在我所知的所有请求中.
不幸的是,这是一个我"继承"的系统,因此无法在基础技术方面做太多改变,也不足以了解nginx + uwsgi + python组合如何在启动Python进程和持久化方面发挥作用Python内存中的数据 - 这意味着我可能会错误地认为我的上述假设!
因此,直接建议这个解决方案是否有效 +对材料的引用可以帮助我理解nginx + uwsgi + python如何在启动新进程和内存分配方面起作用,这将有很大帮助.
PS:
已经阅读了nginx,uwsgi等的一些文档,但还没有完全理解我的用例的后果.希望现在在这方面取得一些进展
如果内存中的东西可以解决,我会扔掉Redis,因为我只缓存上面提到的静态数据.这使得进程内持久性内存中的Python缓存对我来说更具吸引力,减少了系统中的一个移动部分,并且每个请求至少减少了四次网络往返.
您的建议并不是直接可行的。由于新进程可以在您的控制之外上下旋转,因此无法将本机 Python 数据保留在内存中。
\n\n然而,有几种方法可以解决这个问题。
\n\n通常,您只需要一层键值存储即可。有时,您只需要为值提供固定大小的缓冲区(您可以直接将其用作//str对象;您需要在其中存储或以其他方式序列化的任何其他内容)。在这种情况下,uWSGI 的内置缓存框架将处理您需要的一切。bytesbytearraystruct
如果您需要更精确的控制,您可以查看缓存是如何在其上实现的SharedArea并进行一些自定义。但是,我不建议这样做。它基本上为您提供了与文件相同的 API,与仅使用文件相比,唯一真正的优势是服务器将管理文件的生命周期;它适用于所有 uWSGI 支持的语言,甚至是那些不允许文件的语言;如果以后需要,它可以更轻松地将自定义缓存迁移到分布式(多计算机)缓存。我认为这些都与你无关。
另一种获得平面键值存储但没有固定大小缓冲区的方法是使用 Python 的 stdlib anydbm。键值查找就像它所得到的那样:它看起来就像 a dict,不同之处在于它备份到磁盘上的 BDB(或类似)数据库,适当地缓存在内存中,而不是存储在内存中的哈希表。
如果您需要处理其他一些简单类型\xe2\x80\x94任何快速取消/pickle的东西,例如ints\xe2\x80\x94,您可能需要考虑shelve.
如果您的结构足够严格,您可以在顶层使用键值数据库,但通过 访问值ctypes.Structure,或使用 反/序列化struct。但通常,如果你能做到这一点,你也可以消除顶层,此时你的整个事情只是一个大Structure或Array。
此时,您可以仅使用普通文件来存储\xe2\x80\x94,mmap它可以是它(对于ctypes),也可以只是open和read它(对于struct)。
或者使用共享multiprocessing对象直接访问共享内存区域。ctypesStructure
同时,如果您实际上并不总是需要所有缓存数据,而只是偶尔需要一些零碎数据,那么这正是数据库的用途。再说一遍anydbm,等等可能就是您所需要的,但如果您有复杂的结构,请绘制一个 ER 图,将其转换为一组表,然后使用 MySQL 之类的东西。
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |