0

SNS に関する実験を試みました。クエリには暗号 API とトラバーサル API の両方を使用しました。今のところ、各クエリのコストは約 40 ミリ秒です。しかし、マルチスレッドを使用してクエリを実行すると、パフォーマンスが急激に低下し、各クエリのコストは約 200 ミリ秒になります。約 100 万のノードと 2 億の関係があり、gcr cache_type を使用します。必要に応じて、詳細について私の実験を参照してください。

マルチスレッドのホットスポットを見つけるためにvisualVMを使用していますが、NodeManager.lockIdには多くの時間がかかります(実際にはロックされています)。NodeManager.lockId のソースは次のとおりです。

private ReentrantLock lockId( int id )
{
    int stripe = (id / 32768) % LOCK_STRIPE_COUNT;
    if ( stripe < 0 )
    {
        stripe *= -1;
    }
    ReentrantLock lock = loadLocks[stripe];
    lock.lock();
    return lock;
}

public Node getNodeById( int nodeId ) throws NotFoundException
{
    NodeImpl node = nodeCache.get( nodeId );
    if ( node != null )
    {
        return new NodeProxy( nodeId, this );
    }
    ReentrantLock loadLock = lockId( nodeId );
    try
    {
        if ( nodeCache.get( nodeId ) != null )
        {
            return new NodeProxy( nodeId, this );
        }
        if ( !persistenceManager.loadLightNode( nodeId ) )
        {
            throw new NotFoundException( "Node[" + nodeId + "]" );
        }
        node = new NodeImpl( nodeId );
        nodeCache.put( nodeId, node );
        return new NodeProxy( nodeId, this );
    }
    finally
    {
        loadLock.unlock();
    }
}

ノードがキャッシュされていないと、ノードの取得中にロックが発生するようです。node_cache_size と relationship_cache_size のデフォルトを設定すると、設定よりも高速に動作するため、GCR キャッシュ タイプのメカニズムを知りたいと思います。

config.put( "node_cache_size", "1G");
config.put( "relastionship_cache_size", "8G");

GCR キャッシュ タイプの詳細と、cache_type と warmup の設定方法を教えてください。マルチスレッド使用時のパフォーマンスを向上させたい。ありがとう

4

1 に答える 1