Nombre de fils par processeur

en Java, y a-t-il un moyen programmatique pour savoir combien de threads concurrents sont supportés par un CPU?

mise à Jour

pour clarifier, je n'essaie pas de marteler le CPU avec des threads et je suis conscient de L'exécution.getRuntime ().la fonction de processeur disponible (), qui me fournit une partie de l'information que je cherche.

je veux savoir s'il y a un moyen de régler automatiquement la taille du fil piscine de sorte que:

  • si je tourne sur un serveur d'un an, j'obtiens 2 threads (1 thread par CPU x un multiplicateur arbitraire de 2)
  • si je passe à un Noyau quad Intel i7 dans deux ans (qui supporte 2 threads par core), j'obtiens 16 threads (2 logical threads par CPU x 4 CPUs x le multiplicateur arbitraire de 2).
  • si, au lieu de cela, j'utilise un serveur T2 à Huit core Ultrasparc (qui supporte 8 threads par core), j'obtiens 128 fils (8 threads par PROCESSEUR x 8 Processeurs x l'arbitraire multiplicateur de 2)
  • si je déploie le même logiciel sur une grappe de 30 machines différentes, potentiellement achetées à des années différentes, Je n'ai pas besoin de lire les spécifications CPU et de définir des options de configuration pour chacune d'entre elles.
23
demandé sur Leo 2008-10-18 20:35:18

7 réponses

Runtime.les processeurs disponibles renvoie le nombre de processeurs logiques (c.-à-d. les threads matériels) et non des noyaux physiques. Voir CR 5048379 .

23
répondu Tom Hawtin - tackline 2008-10-19 07:07:22

un seul noyau CPU non hyperthreading peut toujours exécuter un thread. Vous pouvez générer beaucoup de threads et le CPU va basculer entre eux.

Le meilleur nombre dépend de la tâche. Si c'est une tâche qui va prendre beaucoup de puissance CPU et ne nécessite pas d'e/s (comme calculer pi, nombres premiers, etc.) alors 1 thread par CPU sera probablement le meilleur. Si la tâche est plus I/O lié. comme l'information de traitement de disque, alors vous obtiendrez probablement de meilleures performances par ayant plus d'un fil par CPU. Dans ce cas, l'accès au disque peut avoir lieu pendant que le CPU traite des informations à partir d'une lecture de disque précédente.

je vous suggère de faire quelques tests sur la façon dont la performance dans vos échelles de situation avec le nombre de threads par noyau CPU et de décider sur la base de cela. Ensuite, lorsque votre application tourne, il peut vérifier availableProcessors() et décider combien de threads il devrait générer. Hyperthreading fera apparaître le noyau unique au système d'exploitation et tous applications, y compris availableProcessors() , comme 2 CPU, donc si votre application peut utiliser l'hyperthreading vous obtiendrez l'avantage. Si ce n'est pas le cas, la performance en souffrira légèrement, mais probablement pas suffisamment pour que l'effort supplémentaire en restauration en vaille la peine.

19
répondu pipTheGeek 2013-05-27 00:12:22

il n'y a pas de méthode standard pour obtenir le nombre de threads pris en charge par le noyau CPU dans Java. Votre meilleur pari est d'obtenir un utilitaire Java CPUID qui vous donne les informations du processeur, puis de les comparer à une table que vous devrez générer qui vous donne les threads par core que le processeur gère sans commutateur de contexte "réel".

- Adam

4
répondu Adam Davis 2008-10-18 21:53:00

un CPU ne pose normalement pas de limite sur le nombre de threads, et je ne pense pas que Java lui-même ait une limite sur le nombre de threads natifs (noyau) qu'il va générer.

il y a une méthode processeurs disponibles () dans la classe Runtime. Est-ce que vous cherchez?

1
répondu JesperE 2008-10-18 16:42:58

Chaque processeur ou processeur core, peut faire exactement 1 chose à la fois. Avec l'hyperthreading, les choses deviennent un peu différentes, mais pour la plupart cela reste toujours vrai, c'est pourquoi ma machine HT au travail ne dépasse presque jamais 50%, et même quand elle est à 100%, elle ne traite pas deux fois plus à la fois.

vous aurez probablement juste à faire quelques tests sur les architectures communes que vous prévoyez de déployer pour déterminer combien de threads vous voulez lancer sur chaque CPU. Juste utiliser 1 thread peut être trop lent si vous attendez beaucoup d'I / O. exécuter beaucoup de threads ralentira les choses vers le bas car le processeur devra échanger des threads plus souvent, ce qui peut être très coûteux. Je ne suis pas sûr s'il ya une limite dur-codé à combien de threads vous pouvez exécuter, mais je gaurantee que votre application serait probablement venir à un crawl trop de commutation de thread avant que vous avez atteint une sorte de limite dur. En fin de compte, vous devriez simplement le laisser en option dans le fichier de configuration., pour que vous puissiez facilement adapter votre application à n'importe quel processeur sur lequel vous l'exécutez.

1
répondu Kibbee 2008-10-18 17:42:54

de base: Application chargée en mémoire est un processus . Un procédé a au moins 1 thread . Si vous voulez, vous pouvez créer autant de threads que vous voulez dans un processus (théoriquement). Donc le nombre de threads dépend de vous et des algorithmes que vous utilisez.

si vous utilisez thread pools , cela signifie que thread pool gère le nombre de threads parce que la création d'un thread consomme des ressources. Les pools de threads recycler les threads. Cela signifie que de nombreux threads logiques peuvent s'exécuter à l'intérieur d'un thread physique un après l'autre.

vous n'avez pas à considérer le nombre de threads , il est géré par les algorithmes de pool de threads. Les pools de threads choisissent différents algorithmes pour les serveurs et les machines de bureau (OSS).

Edit 1: Vous pouvez utiliser threads explicites si vous pensez thread pool n'utilise pas les ressources que tu as. Vous pouvez gérer le nombre de threads explicitement dans ce cas.

1
répondu artur02 2008-10-19 10:22:51

c'est une fonction de la VM, pas du CPU. Il s'agit de la quantité de tas consommée par fil. Quand tu n'as plus de place sur le tas, c'est fini. Comme avec d'autres affiches, je soupçonne votre application devient inutilisable avant ce point si vous dépassez l'espace tas en raison du nombre de fils.

voir ce discussion .

0
répondu tvanfosson 2008-10-18 16:50:38