在多处理环境中读取文件的最快方法? C#
Fastest way to read files in a multi-processing environment? C#
我面临以下挑战:
我有一个包含许多实例的 Azure 云辅助角色。每分钟,每个实例都会启动大约 20-30 个线程。在每个线程中,它需要从 3 个对象中读取一些关于如何处理线程的元数据。 objects/data 驻留在远程 RavenDb 中,尽管 RavenDb 通过 HTTP 检索对象的速度非常快,但它仍然承受着 30 多个工作人员的相当大的负载,每个线程每分钟访问它 3 次(大约 45 requests/sec).大多数时候(比如 99.999%)RavenDb 中的数据不会改变。
我决定实施本地存储缓存。首先,我读取了一条指示元数据是否已更改的小记录(它很少更改),然后我从本地文件存储而不是 RavenDb 读取,如果本地存储缓存了对象。我正在使用 File.ReadAllText()
这种方法似乎会使机器停滞不前,并且处理速度会大大降低。我猜 "Small" 辅助角色上的磁盘速度不够快。
无论如何,我可以 OS 帮我缓存那些文件吗?也许有缓存此数据的替代方法?
我正在查看每个 Cloud Role 实例上存储的大约 1000 个大小不一的文件,大小从 100k 到 10mb 不等
不是直接的答案,而是三个可能的选项:
使用内置的RavenDB缓存机制
我最初的猜测是您的缓存机制实际上会影响性能。 RavenDB 客户端内置了缓存(有关如何对其进行微调,请参见此处:https://ravendb.net/docs/article-page/3.5/csharp/client-api/how-to/setup-aggressive-caching)
您遇到的问题是缓存对于每台服务器都是本地的。如果服务器A之前下载了一个文件,如果下次服务器B恰好处理该文件,仍然需要获取它。
您可以实施的一个可能的选择是划分工作量。例如:
- 服务器 A => 获取以 A-D 开头的文件
- 服务器 B => 获取以 E-H 开头的文件
- 服务器 C => ...
这将确保您优化每台服务器上的缓存。
换台更大的机器
如果您仍想使用自己的缓存机制,我认为有两件事可能是瓶颈:
- 磁盘访问
- 反序列化 JSON
对于这些问题,我唯一能想到的就是获得更大的资源:
- 如果是磁盘,请使用带有 SSD 的高级存储。
- 如果是反序列化,请使用更大的 VM CPU
在 RAM 中缓存文件
或者,不是将文件写入磁盘,而是将它们存储在内存中并获得具有更多 RAM 的 VM。您不需要那么多 RAM,因为 1000 个文件 * 10MB 仍然只有 1 GB。这样做将消除磁盘访问和反序列化。
但最终,最好首先衡量瓶颈在哪里,看看是否可以通过使用 RavenDB 的内置缓存机制来缓解它。
我面临以下挑战:
我有一个包含许多实例的 Azure 云辅助角色。每分钟,每个实例都会启动大约 20-30 个线程。在每个线程中,它需要从 3 个对象中读取一些关于如何处理线程的元数据。 objects/data 驻留在远程 RavenDb 中,尽管 RavenDb 通过 HTTP 检索对象的速度非常快,但它仍然承受着 30 多个工作人员的相当大的负载,每个线程每分钟访问它 3 次(大约 45 requests/sec).大多数时候(比如 99.999%)RavenDb 中的数据不会改变。
我决定实施本地存储缓存。首先,我读取了一条指示元数据是否已更改的小记录(它很少更改),然后我从本地文件存储而不是 RavenDb 读取,如果本地存储缓存了对象。我正在使用 File.ReadAllText()
这种方法似乎会使机器停滞不前,并且处理速度会大大降低。我猜 "Small" 辅助角色上的磁盘速度不够快。
无论如何,我可以 OS 帮我缓存那些文件吗?也许有缓存此数据的替代方法?
我正在查看每个 Cloud Role 实例上存储的大约 1000 个大小不一的文件,大小从 100k 到 10mb 不等
不是直接的答案,而是三个可能的选项:
使用内置的RavenDB缓存机制
我最初的猜测是您的缓存机制实际上会影响性能。 RavenDB 客户端内置了缓存(有关如何对其进行微调,请参见此处:https://ravendb.net/docs/article-page/3.5/csharp/client-api/how-to/setup-aggressive-caching)
您遇到的问题是缓存对于每台服务器都是本地的。如果服务器A之前下载了一个文件,如果下次服务器B恰好处理该文件,仍然需要获取它。
您可以实施的一个可能的选择是划分工作量。例如:
- 服务器 A => 获取以 A-D 开头的文件
- 服务器 B => 获取以 E-H 开头的文件
- 服务器 C => ...
这将确保您优化每台服务器上的缓存。
换台更大的机器
如果您仍想使用自己的缓存机制,我认为有两件事可能是瓶颈:
- 磁盘访问
- 反序列化 JSON
对于这些问题,我唯一能想到的就是获得更大的资源:
- 如果是磁盘,请使用带有 SSD 的高级存储。
- 如果是反序列化,请使用更大的 VM CPU
在 RAM 中缓存文件
或者,不是将文件写入磁盘,而是将它们存储在内存中并获得具有更多 RAM 的 VM。您不需要那么多 RAM,因为 1000 个文件 * 10MB 仍然只有 1 GB。这样做将消除磁盘访问和反序列化。
但最终,最好首先衡量瓶颈在哪里,看看是否可以通过使用 RavenDB 的内置缓存机制来缓解它。