标签: shared-memory

PHP中最快的IPC

我想知道,这是在PHP中将数据从一个进程发送到另一个进程的最快方法吗?数据只是一个短字符串.Curretly我有一个开发了AF_UNIX套接字的解决方案,但基准测试显示将数据从一个进程传递到另一个进程需要0.100毫秒.我想知道,如果共享内存可以更快吗?但是,我不知道,如果有任何新的数据写入,如何让其他进程定期检查共享内存来检测?

当前解决方案

$server = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($server, '/tmp/mysock');
socket_listen($server);
while(true) {
  $r = $clients;
  if(socket_select($r, $w, $e, 5) > 0) {
    $client = socket_accept($server);
    $d = trim(socket_read($client, 256, PHP_NORMAL_READ));
    echo (microtime(true)-$d)."\n";
    socket_close($client);
  }
  flush();
}
socket_close($server);
Run Code Online (Sandbox Code Playgroud)

和客户:

$d = microtime(true)."\n";
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, '/tmp/mysock');
socket_write($socket, $d, strlen($d));
socket_close($socket);
Run Code Online (Sandbox Code Playgroud)

这个解决方案完全正常,很好,但结果是这样的:

0.00019216537475586
9.5129013061523E-5
0.00011920928955078
0.00011801719665527
7.6055526733398E-5
Run Code Online (Sandbox Code Playgroud)

任何想法,如何使这个脚本更快或开发更快(可能是共享内存)的解决方案?

在此先感谢,乔纳斯

php sockets ipc stream shared-memory

6
推荐指数
1
解决办法
4032
查看次数

Windows 共享内存段

我一直在谷歌上搜索这个,并没有找到明确的答案,所以我希望有人对 Windows VS linux 中的共享内存段有一些了解。

在 Linux 中有两种为 IPC 创建共享内存的方法:共享内存段(shmget 等)和内存映射文件(mmap)。根据我的简要理解,mmap 要求您在操作系统中的某处有一个实际文件进行映射,而共享内存段只是内存中可以由进程附加到的基于名称的段。

在 Windows 中,似乎只有内存映射文件等价于您必须在某处浮动的实际文件。

我的问题:这实际上是 Windows 中唯一的共享内存,还是它有用于创建非基于文件的共享内存段的 api。

c windows shared-memory

6
推荐指数
1
解决办法
5761
查看次数

如何将 docker 中的 /proc 文件系统重新挂载为 ar/w 系统?

我已经在 Ubuntu 12.04 上安装了 docker 0.11.1。当我运行以下命令时,我试图将 shmmax 从其固定值 (32 M) 更改为更大 (1G) 的值(1G):

sysctl -w kernel.shmmax=1073741824
error: "Read-only file system" setting key "kernel.shmmax"
Run Code Online (Sandbox Code Playgroud)

那是因为/proc安装ro在容器中。

有人能告诉我如何r/w在我的容器中安装 proc来更改它吗?

linux ubuntu shared-memory procfs docker

6
推荐指数
1
解决办法
9706
查看次数

使用 ctypes 从 python 访问 boost::进程间共享内存块

我在 Windows 上运行的 C++ 程序中有一个结构,我想使用 ctypes 通过 Python 中的共享内存来访问该结构。例如:

#define MAX_ENTITIES 30

struct State
{
   double x;
   double y;
   double z;
};

struct Stat
{
   unsigned int numAvailable;
   unsigned int numUsed;
};

struct TransferData
{
   double exLg;
   float other;
   unsigned int more;
   int more2;
   unsigned char next;
   bool statusReady;

   Stat status;
   State entities[MAX_ENTITIES];
};
Run Code Online (Sandbox Code Playgroud)

作为:

import ctypes

MAX_ENTITIES = 30


class State(ctypes.Structure):
    _fields_ = [
        ('x', ctypes.c_double),
        ('y', ctypes.c_double),
        ('z', ctypes.c_double)
    ]


class Stat(ctypes.Structure):
    _fields_ = [
        ('numAvailable', ctypes.c_uint),
        ('numUsed', …
Run Code Online (Sandbox Code Playgroud)

c++ python boost shared-memory

6
推荐指数
1
解决办法
3186
查看次数

Python 如何在多个进程之间共享内存?

我读到进程在单独的内存空间(链接)上运行。然而,python 的 multiprocessing 包提供了共享内存(multiprocessing.Value、multiprocessing.Array)。

  • 这些数据存储在哪里(在哪个进程中)?
  • 子进程是否通过引用访问数据?

python shared-memory multiprocessing

6
推荐指数
1
解决办法
802
查看次数

跨 Docker 容器共享内存:“--ipc=host”与“--ipc=shareable”

我正在设置两个 docker 容器 - 一个作为服务器将数据保存在内存中,另一个作为客户端来访问该数据。为了做到这一点,我相信我需要使用该--ipc标志在容器之间共享内存。Docker文档--ipc很好地解释了该标志。根据正在运行的文档,对我来说有意义的是:

docker run -d --ipc=shareable data-server
docker run -d --ipc=container:data-server data-client
Run Code Online (Sandbox Code Playgroud)

但我读过的所有 Stackoverflow 问题(1、2、3、4 )将两个容器直接链接到主机:

docker run -d --ipc=host data-server
docker run -d --ipc=host data-client
Run Code Online (Sandbox Code Playgroud)

哪个更适合这个用例?如果ipc=host更好,什么时候使用ipc=shareable

ipc shared-memory docker

6
推荐指数
1
解决办法
1万
查看次数

如何调整 /dev/shm 的大小?

On Ubuntu 18.04, 当我跑步时

$ df -h,

我看到这个结果:

Filesystem      Size  Used Avail Use% Mounted on
...
tmpfs           3,9G   73M  3,8G   2% /dev/shm
...
Run Code Online (Sandbox Code Playgroud)

/dev/shm 有3.9G大小。

我怎么能改变的大小/dev/shm

linux shared-memory

6
推荐指数
2
解决办法
1万
查看次数

用对象填充 SharedArrayBuffer

我的应用程序从外部源接收数据并将其分组(匹配组项目并将结果显示为 HTML 表格,高达 20k 消息/秒)。

问题是共享内存:应用程序实时工作,我收到带有“创建、更新、删除”标志的消息,因此我将所有内容存储在 RAM 中,不需要任何数据库。但是,当我尝试集群时,某些集群会丢失我的应用程序消息(我尝试使用pm2进行集群)。

因此,现在我尝试使用 WorkerThreads 扩展我的应用程序,但是通过通信parentPort.postMessage/worker.postMessage需要对应用程序进行大量更改。所以现在我尝试通过共享内存SharedArrayBuffer,但我不明白如何在主机和工作人员之间共享对象数组。

const {
  Worker, isMainThread, parentPort, workerData
} = require('worker_threads');

if (isMainThread) {
  const sab = new SharedArrayBuffer(1024);
  sab[0] = {foo: 'bar'};
  const worker = new Worker(__filename, {
    workerData: sab
  });

  setInterval(() => {
   console.log( sab[0] ); // always {foo: 'bar'}
  }, 500);

} else {
  let sab = workerData;
  sab.foo = false; // changing "foo" value at worker but not in main thread …
Run Code Online (Sandbox Code Playgroud)

worker shared-memory node.js service-worker

6
推荐指数
0
解决办法
923
查看次数

使用 Python 共享内存的分段错误

该函数store_in_shm将 numpy 数组写入共享内存,而第二个函数read_from_shm使用同一共享内存空间中的数据创建 numpy 数组并返回 numpy 数组。

但是,在 Python 3.8 中运行代码会出现以下分段错误:

zsh:分段错误 python foo.py

为什么从函数内部访问numpy数组没有问题read_from_shm,但在函数外部再次访问numpy数组时出现分段错误?

输出:

From read_from_shm(): [0 1 2 3 4 5 6 7 8 9]
zsh: segmentation fault  python foo.py
% /Users/athena/opt/anaconda3/envs/test/lib/python3.8/multiprocessing/resource_tracker.py:203: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '
Run Code Online (Sandbox Code Playgroud)

foo.py

import numpy as np
from multiprocessing import shared_memory

def store_in_shm(data):
    shm = shared_memory.SharedMemory(name='foo', create=True, size=data.nbytes)
    shmData …
Run Code Online (Sandbox Code Playgroud)

python macos numpy shared-memory python-3.8

6
推荐指数
1
解决办法
3345
查看次数

检查 Numpy 数组是否存储在共享内存中

在 Python 3.8+ 中,是否可以检查 numpy 数组是否存储在共享内存中?

在以下示例中,sharedArr使用对象的缓冲区创建了一个 numpy 数组multiprocessing.shared_memory.SharedMemory。想知道是否可以写一个函数来检测是否SharedMemory被使用。

import numpy as np
from multiprocessing import shared_memory

if __name__ == '__main__':
    # Created numpy array `sharedArr`in shared memory
    arr = np.zeros(5)
    shm = shared_memory.SharedMemory(create=True, size=arr.nbytes)
    sharedArr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)
    sharedArr[:] = arr[:]

    # How to tell if numpy array is stored in shared memory?
    print(type(sharedArr))      # <class 'numpy.ndarray'>
    print(hex(id(sharedArr)))   # 0x7fac99469f30

    shm.close()
    shm.unlink()
Run Code Online (Sandbox Code Playgroud)

python numpy shared-memory sysv python-3.x

6
推荐指数
1
解决办法
974
查看次数