Forwarding with Multiple Threads

  • I've been testing forwarding performance over WAN links that contain a rather normal latency (ie. 50-60ms), it becomes very hard to saturate a single tcp session/DICOM association.


    Since DICOM has many handshakes and is very chatty during negotiation/transmission is there any possibility of creating two or three simultaneous threads to maximize throughput? It seems to me that if it was possible, forwarding speeds could possibly be doubled or tripled if a single thread isn't saturating the entire bandwidth. Playing with tcp window sizes only goes so far when trying to push data over connections with latency. This becomes particularly applicable when talking about smaller files such as mri/ct etc where there are many starts/stops. What are your thoughts?


    John

  • Hi,


    which forward statement do you use? The normal "forward to" has a lot overhead. The delayed "forward series to" may perform better on a high latency link. Yet, I will think about a mulithread forward.


    Marcel

  • I've tried both forward STUDY and forward to. Here are my configs. I'm actually forwarding a few times. From a client site with CT to a cloud conquest server back to another hospital conquest server...a few links have 50ms. I'm forwarding by image on the second forward because it seems to keep up with the first forward real-time. It works great but the bandwidth is not being pushed to the limits at all. it could easily handle 2-3 threads of forwarding but I'm not sure if that's possible or you would have to open up additional series associations and thread by series because image associations would probably kill the idea. Also images from a Philps Brilliance 16 doesn't compress all images with NKI but did with JPEG Lossless for some reason ( only half the study's images compresses). j2 definitely helps forwarding times but not sure why NKI couldn't compress all images like JPEG Lossless.



    CT(uncompressed) ---> CONQUEST1 (store j2)-----------forward STUDY compressed as j2----CONQUEST2(store j2)---------forward compressed as j2----> CONQUEST3 (store j2)



    Configuration of forwarding and/or converter programs to export DICOM slices
    ForwardAssociationLevel = SERIES
    ForwardAssociationCloseDelay = 15
    ForwardAssociationRefreshDelay = 3600
    ForwardAssociationRelease = 1


    ExportConverters = 1
    ExportCalledAE0 = CONQUEST1
    ExportConverter0 = forward STUDY compressed as j2 to CONQUEST2


    ForwardCollectDelay = 180
    MaximumExportRetries = 0
    MaximumDelayedFetchForwardRetries = 0



    # Configuration of forwarding and/or converter programs to export DICOM slices
    ForwardAssociationLevel = SERIES
    ForwardAssociationCloseDelay = 15
    ForwardAssociationRefreshDelay = 3600
    ForwardAssociationRelease = 1


    ExportConverters = 1
    ExportCalledAE0 = CONQUEST2
    ExportConverter0 = forward compressed as j2 to CONQUEST3


    MaximumExportRetries = 0
    MaximumDelayedFetchForwardRetries = 0

  • Hi,


    I just realize that you can try this to export images subdivided by SOPInstanceUID (a CRC is used) over 10 simultaneous threads (each exportconverter runs in its own thread):


    Edit: for correct syntax see below
    ExportConverters = 10
    ExportConverter0 = ifequal %A0008,0018[0,0], "0"; forward to SLOWSYSTEM
    ExportConverter1 = ifequal %A0008,0018[0,0], "1"; forward to SLOWSYSTEM
    ExportConverter2 = ifequal %A0008,0018[0,0], "2"; forward to SLOWSYSTEM
    ExportConverter3 = ifequal %A0008,0018[0,0], "3"; forward to SLOWSYSTEM
    ExportConverter4 = ifequal %A0008,0018[0,0], "4"; forward to SLOWSYSTEM
    ExportConverter5 = ifequal %A0008,0018[0,0], "5"; forward to SLOWSYSTEM
    ExportConverter6 = ifequal %A0008,0018[0,0], "6"; forward to SLOWSYSTEM
    ExportConverter7 = ifequal %A0008,0018[0,0], "7"; forward to SLOWSYSTEM
    ExportConverter8 = ifequal %A0008,0018[0,0], "8"; forward to SLOWSYSTEM
    ExportConverter9 = ifequal %A0008,0018[0,0], "9"; forward to SLOWSYSTEM
    Edit: for correct syntax see below


    I am looking into the NKI compression issue.


    Marcel

  • Hi,


    the NKI compression refuses to compress because its own private tag 7fdf,0010 happens to be in use by Philips (it states ELSCINT1). Conquest behavior in this is by design and cannot be changed unless you use an importconverter to delete 7fdf,0010 when data arrives from philips so that the tag is free for conquest.


    Code
    (7fdf,0000) UL 32 # 4 GroupLength
    (7fdf,0010) OW \45\4c\53\43\49\4e\54\31 # 8 NKI_PixelData
    (7fdf,10f0) UN (empty) # 0 ?
    (7fdf,10ff) UN (empty) # 0 ?
    (7fe0,0000) UL 524296 # 4 PixelDataGroupLength
    (7fe0,0010) OW (not loaded) # 524288 PixelData


    Marcel

  • Good to know for others too I guess. I will try to exporter and see what happens. On the forwarder.....it does it really really fast however it seems to be sending the same images over and over frequently?! Could this be? Do you have to be running mysql or can you use built-in database for this exporter to properly work? Can you do a ends with type logic to split it up or even a series number ends in X to split the threads out.

  • I think I figured it out. I had to add apostrophes to the exporter code. I'm not sure if using ifnumequal makes any difference from using ifequal but i'm leaving it alone as it works. It is slinging images out very quick though over wan because it is usually threading 8-10 at a time. For anyone that wants to forward images and saturate a wan link. This is definitely the best speed I've been able to get so far from exporters and traversing higher latency links. Thanks so much Marcel.


    ExportConverters = 10
    ExportConverter0 = ifnumequal "%A0008,0018[0,0]", "0"; forward compressed as j1 to NRADSTORE
    ExportConverter1 = ifnumequal "%A0008,0018[0,0]", "1"; forward compressed as j1 to NRADSTORE
    ExportConverter2 = ifnumequal "%A0008,0018[0,0]", "2"; forward compressed as j1 to NRADSTORE
    ExportConverter3 = ifnumequal "%A0008,0018[0,0]", "3"; forward compressed as j1 to NRADSTORE
    ExportConverter4 = ifnumequal "%A0008,0018[0,0]", "4"; forward compressed as j1 to NRADSTORE
    ExportConverter5 = ifnumequal "%A0008,0018[0,0]", "5"; forward compressed as j1 to NRADSTORE
    ExportConverter6 = ifnumequal "%A0008,0018[0,0]", "6"; forward compressed as j1 to NRADSTORE
    ExportConverter7 = ifnumequal "%A0008,0018[0,0]", "7"; forward compressed as j1 to NRADSTORE
    ExportConverter8 = ifnumequal "%A0008,0018[0,0]", "8"; forward compressed as j1 to NRADSTORE
    ExportConverter9 = ifnumequal "%A0008,0018[0,0]", "9"; forward compressed as j1 to NRADSTORE

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!